将控制器变量或参数传递给辅助模块

时间:2014-01-14 09:39:23

标签: ruby-on-rails ruby-on-rails-3 helper

我有一个HTML模板,它应该根据控制器上的某些设置更改application.rb模板中的body类。

当我想从视图中改变它时,我知道如何做到这一点。我这样做的事情是:

# in view
<% layout_class("full", boxed: false) %>

# helper method
module TemplateHelper
  def layout_class(class_name="")
    content_tag("body", :id => "fluidGridSystem", :class => class_name) do
      yield
    end
  end
end

忘记上面的行!

我想在控制器中实现这一点

# index_controller.rb
class IndexController < ApplicationController
  def index
    @layout_class = "hello"
  end
end

# app/helpers/template_helper.rb
module TemplateHelper

  def body_wrapper
    content_tag("body", :id => "fluidGridSystem", :class => @layout_class) do
      if some_logic # show <body> only
        yield
      else # add some more <div>'s
        blog_wrapper do
          yield
        end
      end
    end

    def blog_wrapper(inner="", outer="")
      content_tag("div", :class => outer) do
        content_tag("div", :class => inner) do
          yield
        end
      end
    end
  end
end

# application.rb
<html>
  <head>
  </head>
  <%= body_wrapper do %> # this part generates <body class="hello">
    <%= flash_messages %>
    <%= yield %>
  <% end %> # </body>
</html>

@layout_class未传递给助手。

  • 我该怎么做?
  • 或者观点是否更好?
  • 原因是我想添加面包屑和依赖于控制器逻辑的主体类。

1 个答案:

答案 0 :(得分:0)

我认为你的问题是你的助手方法的名字与你所说的不同?

我不知道body_wrapper,但您正在调用layout_class - 两种不同的方法。你为什么不试试这个:

#app/helpers/template_helper.rb
module TemplateHelper
  def layout_class 
    content_tag("body", :id => "fluidGridSystem", :class => @layout_class ) do
     yield
    end
  end
end

#app/views/layouts/application.html.erb
<body class="<%= layout_class(@layout_class) %>">

还有另外两种方法可以做到这一点:

<强> 1。更改布局

如果您只有一些标准需要更改,您可以尝试:

#app/controllers/your_controller.rb
layout :layout

private

def layout
    if #your_logic
        "layout"
    else
        "other_layout"
    end
end

<强> 2。直接从视图

致电@layout_class
#app/views/layouts/application.rb
<body class="<%= @layout_class %>">

如果设置了@layout_class,这将显示该类,如果不是

,则不会发布“class”属性