对于一个应用程序,我需要几个具有或多或少相同行为的控制器(每个控制器都有一些特殊性)。 所以基本上,我有类似的东西:
# 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
干杯, 文森特
答案 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