Rails基于控制器操作的条件('if')语句

时间:2009-08-25 15:40:21

标签: ruby-on-rails

可能有更好的方法可以做到这一点,但我正在尝试在rails中根据当前操作在控制器中创建一个if语句(这将在视图中使用)。

例如,如果是编辑页面或节目页面等,我想要一种不同的风格 - 是否有可以指定的if语句?

(我需要一个if语句,因为它在多个页面上用于部分语句。)

谢谢!

埃利奥特

4 个答案:

答案 0 :(得分:49)

控制器中可用的params哈希包含:controller:action个键,用于指定请求的控制器和操作名称。

因此你可以说

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

答案 1 :(得分:23)

IMO让部分人询问当前的控制器和动作名称是不好的做法。想想“告诉,不要问”(http://www.pragprog.com/articles/tell-dont-ask)。也就是说,不是让部分询问它的调用者的状态,而是告诉部分你想要它做什么。

执行此操作的一种方法是通过locals选项将变量传递给partial:

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

然后在部分:

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

答案 2 :(得分: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

希望它有帮助=)

答案 3 :(得分:1)

您也可以使用部分布局:

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

如果你想弄清楚动态使用什么布局,我会把它放在帮手中。所以你最终得到了

# 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