Rails - 多个控制器的独特模板

时间:2014-03-21 08:32:13

标签: ruby-on-rails ruby-on-rails-3.2

对于一个应用程序,我需要几个具有或多或少相同行为的控制器(每个控制器都有一些特殊性)。 所以基本上,我有类似的东西:

# controllers/main.rb
MainController < ActionController::Base
  def show
    ...
  end

  def create
    ...
  end

  def destroy
    ...
  end
end

# controllers/first.rb
FirstController < MainController
  helper_method :custom_stuff_one

  private
  def custom_stuff_one
    'bli'
  end
end

# controllers/second.rb
SecondController < MainController
  helper_method :custom_stuff_two

  private
  def custom_stuff_two
    'bla'
  end
end

# routes.rb
resources :first, :only => [:show, :create, :destroy]
resources :second, :only => [:show, :create, :destroy]

这很好用,但我不能为模板提供同样的简单性。我喜欢的东西很简单:

# views/main/show.html.erb
<html>
  <body>
    Here the stuff in common for all controllers ...
  </body>
</html>

# views/first/show.html.erb
<%= stylesheet_link_tag('my_css_only_for_first') %>
<%= javascript_include_tag(custom_stuff_one) %>

# views/second/show.html.erb
<%= stylesheet_link_tag('another/css/file') %>
<%= javascript_include_tag(custom_stuff_two) %>

当然,当访问/ first / 1时,呈现的模板是&#34; views / main / show.html.erb&#34; (以及来自&#34; views / first / show.html.erb&#34;的包含标签。)

我对收益率,布局等感到有些失落......(而且我也想知道我是否也没有对控制器继承做错...)

有什么想法吗?

注意:我们正在使用Rails 3.2.17,Ruby 2.1.1

干杯, 文森特

2 个答案:

答案 0 :(得分:2)

您应该在头部使用带有自定义屈服线的布局:

yield :head

然后你可以从你个人的观点中添加一些内容。例如,来自你的show.html.erb:

<% content_for :head do
<%= stylesheet_link_tag('another/css/file') %>
<%= javascript_include_tag(custom_stuff_two) %>
<% end %>

查看更多信息here

答案 1 :(得分:2)

使用你已经拥有的控制器,如果你查询/ first / 1,你将渲染/ first / show并且不会考虑main / show。你想要使用的是布局,布局是一段可在控制器之间重复使用的HTML代码。

然后,您应该创建一个名为layouts / layout_name.html.erb的文件:

<html>
  <head>
    <%= yield :head %>
  <head>
  <body>
    <%=yield%>
  </body>
</html>

在您的控制器上,添加

# controllers/first.rb
FirstController < MainController
  helper_method :custom_stuff_one
  layout :layout_name
  ...
end

关于你的观点 首先:

<%=content_for :head do%>
  <%= stylesheet_link_tag('my_css_only_for_first') %> #This will display in the head
<%end%>

<div>FOO</div> #This will display in the body