2009-08-25 17 views
27

もっと良い方法があるかもしれませんが、コントローラの現在のアクションに基づいて、if文をレールに作成しようとしています。ビューで使用する)。コントローラのアクションに基づく条件文( 'if')文

たとえば、編集ページ、または表示ページなどの場合、私は何か別のスタイルを使いたいと思います。これを指定できるif文はありますか?

(if文は部分的に複数のページで使用されるため、必要です)。

ありがとうございます!

エリオット

答えて

47

コントローラは、要求のコントローラとアクション名を指定:controller:actionキーを含んで提供されparamsハッシュ。

そのため、あなたはこのようにそれを行うことができます

if params[:action] == "foo" 
    # Show stuff for action 'foo' 
elsif params[:action] == "bar" 
    # Show stuff for action 'bar' 
elsif ... 
    # etc. 
end 
+1

恐ろしい感謝!!!! – Elliot

+1

多くのおかげさま...未来からのメッセージ:D –

3

を言うことができる:

class ApplicationController < ActionController::Base 
    layout :set_layout 

    def set_layout 
    case params[:action] 
    when "foo" 
     "foo_layout" 
    when "bar" 
     "bar_layout" 
    ... 
    else 
     "default_layout" 
    end 
    end 

    ... 

end 

はそれが=に役立ちます願っています)

+0

それはページ全体のレイアウトにしか使えませんね。質問よりもむしろ部分的であれば。 – Shadwell

+0

私はApplicationControllerのコードを編集しました。その場合、アクションは異なるコントローラー全体で使用されるため、今の方が理にかなっています)。 – Staelen

+0

それでも、ページのレイアウトを設定するだけですね。 – Shadwell

1

あなたもパーシャルのためのレイアウトを使用することができます。

<%= render :partial => 'some_partial', :layout => 'wrap_with_stuff' %> 

oどのレイアウトを動的に使うのか、私はそれをヘルパーに入れます。ですから、

# In your view 

<%= render :partial => 'some_partial', :layout => layout_for_my_partial %> 

# In your helper 

def layout_for_my_partial 
    params[:action] == 'show' ? 'show_wrapper' : 'everything_else_wrapper' 
end 

これで終わるだろうとだけいくつかの状況では動作しますが、あなたが何をしようとしてかもしれません。

詳細はこちらをご覧ください。

http://ryandaigle.com/articles/2007/8/3/what-s-new-in-edge-rails-partials-get-layouts

18

これは、現在のコントローラとアクションの名前が何であるかを尋ねるパーシャルを持っているIMO良い習慣ではありません。 「教えて、尋ねないでください」と考えてください(http://www.pragprog.com/articles/tell-dont-ask)。つまり、部分的にその状態についての呼び出し元に尋ねるのではなく、に部分的に指示します。

<%= render :partial => "/common/toolbar", :locals => {:edit => true} %> 

その後、部分的に:これを行うには

一つの方法は、localsオプションによって部分的に変数を渡すことである

<% if defined?(edit) && edit %> 
... stuff appropriate to edit mode 
<% end %>