2012-02-17 10 views
11

私は、indexshowの2つのアクションが定義されたレールコントローラを持っています。 私はindexアクションで定義されたインスタンス変数を持っています。私はshow.html.erbテンプレートで@some_instance_variableにアクセスするにはどうすればよいコントローラのすべてのアクションの同じインスタンス変数

def index 
    @some_instance_variable = foo 
end 

def show 
    # some code 
end 

:以下のコードは、のようなものでしょうか?

答えて

10

show.html.erbindexアクションからレンダリングしている場合を除き、表示アクションでも@some_instance_variableを設定する必要があります。コントローラーアクションが呼び出されると、一致するメソッドが呼び出されます。showアクションを使用しているときは、indexメソッドの内容は呼び出されません。

あなたは両方indexshowアクションで同じものを@some_instance_variableセットが必要な場合は、正しい方法は、インスタンス変数を設定しindexshowの両方によって呼び出される別の方法を、定義することです。

def index 
    set_up_instance_variable 
end 

def show 
    set_up_instance_variable 
end 

private 

def set_up_instance_variable 
    @some_instance_variable = foo 
end 

set_up_instance_variableメソッドのプライベートを作るには、ワイルドカードのルートを持っている場合は、コントローラのアクションとして呼び出されるのを防止する(すなわち、match ':controller(/:action(/:id(.:format)))'

+1

ありがとう@エミリー。しかし、これを行うDRY方法はありますか? – Red

+0

ありがとう@エミリー私は同じものを探していました。乾杯! – Aashish

+0

'before_action:set_up_instance_variable、only:[:show、:index]'をコントローラに追加するだけです。これはあなたが指定したアクションの前に 'set_up_instance_variable'を実行します。 – domi91c

52

あなたは例えば、フィルタの前に使用して、複数のアクションのインスタンス変数を定義することができます。:今すぐ

class FooController < ApplicationController 
    before_filter :common_content, :only => [:index, :show] 

    def common_content 
    @some_instance_variable = :foo 
    end 
end 

@some_instance_variableindexまたはshowアクションからレンダリング(パーシャルを含む)すべてのテンプレートからアクセスできるようになります。

+4

これは良い答えです! –

+0

非常にドライです。ニース! – Red

+0

@Moriプライベートスペースや保護されたスペース、パブリックスペースにメソッド/オブジェクトを配置するかどうかを決定する方法はありますか?すごい! – Red

関連する問題