2017-08-31 7 views
1

私はそのように私のApplicationControllerでインスタンス変数を定義しました:Railsモデルからインスタンス変数にアクセスする方法は?

@team = Team.find(params[:team_id]) 

さて、私のEventsCreatorモデルでは、私が上から@teamにアクセスしたい:私は得ることのコードで

class EventsCreator 
    # ... 

    def team_name 
    name = @team.name 
    # ... 
    end 

    # ... 
end 

を次のエラー:

undefined method `name' for nil:NilClass

モデルからこのようなインスタンス変数にどのようにアクセスする必要がありますか?そうするためには、よりよい方法やより良い習慣がありますか?


編集1:

event.rbモデルは、データベースに保存される共通情報を含むモデルである:

class Event < ApplicationRecord 
    belongs_to :team 
    attr_accessor :comment 
    ... 
end 

events_creator.rbモデルでの拡張の一種でありますevent.rb。それはいくつかのロジックを含む。繰り返しイベントの場合:

class EventsCreator 
    include ActiveModel::Model 
    attr_accessor :beginning, :ending, :repeat_frequency, :repeat_until_date 
    ... 
end 

EventsCreatorは、DBにレコードを直接作成しません。これはちょうどいくつかのロジックを行い、Eventモデルを通してデータを保存します。

今、私はapplication_controller.rbで定義されている@team変数インスタンスにアクセスできるようにしたいteam.rbに直接関係を持たずに:私はteam_idを必要とするので

class ApplicationController < ApplicationController::Base 
    before_action :set_team_for_nested 

    private 
    def set_team_for_nested 
    @team = Team.find(params[:team_id]) 
    end 
end 

マイroutes.rbファイルがteam内のすべてのルートをネストさをすべてのアクションのために:

Rails.application.routes.draw do 
    resources :teams do 
    resources :events 
    get '/events_creator', to: 'events_creator#new', as: 'new_events_creator' 
    post '/events_creator', to: 'events_creator#create', as: 'create_events_creator' 
    end 
end 

今私は(これはI @teamインスタンス変数にアクセスする方法を見当がつかない思考はモデル全体からアプリケーション全体に対して定義されています)。私はRailsにとっては初めてのことなので、何かを混乱させるかもしれません。同じことを達成するより良い方法があるかどうか教えてください。

class EventCreator 

    ... 

    def team_name 
    name #will return name of class instance 
    #or do something with it 
    end 
end 
+0

を行うことができますActiveModel::Modelを含めた上で計画している場合あなたは、例えば、EventCreatorの初期化子でそれを渡すことができます。 'event_creator = EventCreator.new(@team)' –

+0

私はあなたの問題に適合しないので、私の答えを削除しました。私は今、@patkoperwasと同じことを提案します。 – Chris

答えて

-1

あなたのクラスに引数としてteamに合格する必要があります。

class EventsCreator 
    attr_reader :team 
    def initialize(team) 
    @team = team 
    end 

    def some_method 
    puts team.name 
    end 
end 

# Then in your controller you can do this 
def create 
    EventsCreator.new(@team) 
end 

あなたは、あなたがちょうど

class EventsCreator 
    include ActiveModel::Model 
    attr_accessor :team 

    def some_method 
    puts team.name 
    end 
end 

# And then in your controller it's the same thing 
def create 
    EventsCreator.new(@team) 
end 
+1

私はこれが答えで、あなたの*説明*が "シンプル"なので、あなたが何かを作ったと思うので、 – engineersmnky

+0

(彼はインスタンスプロパティにアクセスしたいと思います。どうしましたか? - )) – marmeladze

+0

別の(未定義の)メソッドを呼び出す方法や、存在しないローカル変数を記述する方法を示しただけです。あなたは説明がなく、確かにインスタンス変数はありません。これは実際には – engineersmnky

関連する問題