好的,所以我遇到了rails和渲染局部的问题。我有一个名为profile的布局,在配置文件布局中我包含了所有的js,样式表等。
<html>
<head>
<title>Profile</title>
<%= javascript_include_tag "https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" %>
<%= javascript_include_tag "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js" %>
<%= javascript_include_tag "application" %>
<%= stylesheet_link_tag "main" %>
<%= stylesheet_link_tag "reset" %>
<%= csrf_meta_tag %>
</head>
<body>
<%= yield %>
</body>
</html>
上面的yield标签(profile / index.html.erb)内容如下
<%= render :partial => 'pages/page', :layout => "layouts/default", :locals => {:page => @page } %>
现在在页面/页面视图中有相同的默认标签,例如css和js文件。当我删除CSS样式然后我失去了页面/页面视图的样式。有没有一种方法可以渲染部分而不回忆相同的css和js文件或者更好的方法来做这样的事情?
答案 0 :(得分:4)
我总是创建覆盖样式表的选项,如下所示:
<%= stylesheet_link_tag content_for?(:stylesheets) ? yield(:stylesheets) : "application", :debug => Rails.env.development? %>
然后在视图中
<% content_for :stylesheets %> some stuff or nothing in here <% end %>
这将允许您在布局中指定的视图中指定您不需要样式表,并且相同的原则适用于javascripts。
如果您在具有html标签和头部等的布局中渲染部分内容,那么您应该调查是否有更好的方法来执行您正在做的事情。
答案 1 :(得分:3)
我很少看到(或者我想知道Rails是否支持这种用法......)
<!-- confirmed, this usage will cause error in Rails 3.2 -->
<%= render :partial => "some_partial", :layout => "some_layout" ... %>
我更喜欢在控制器中选择特定的布局:
def some_action
# some code
render :layout => "some_layout"
end
答案 2 :(得分:3)
你需要选择一个或另一个。布局原始方法调用或将布局传递给局部。这两种做法都是不合逻辑的。
这里有一个更彻底的讨论:
http://mikemayo.org/2012/rendering-a-collection-of-partials-with-content_for
答案 3 :(得分:1)
部分基本上只是一个“切片页面”(就像一块蛋糕......但是代码形式)。它旨在填充页面的一小部分;通常会根据页面变量动态更新。
好像你混淆了布局,视图和放大器的目的。在我看来是局部的。如果要动态加载CSS / JS,请在配置文件视图中使用默认布局添加“content_for”块,如下所示:
<强>布局强>
#layouts/default.rb
<html>
<head>
<title>Site Title</title>
<%= javascript_include_tag "https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" %>
<%= javascript_include_tag "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js" %>
<%= javascript_include_tag "application" %>
<%= stylesheet_link_tag "main" %>
<%= stylesheet_link_tag "reset" %>
<%= yield :header_includes %>
<%= csrf_meta_tag %>
</head>
<body>
<%= yield %>
</body>
</html>
<强>视图强>
#views/profiles/index.html.erb
<% content_for :header_includes do %>
<%= stylesheet "profile_custom_css" %>
<% end %>
部分可用于保持您的代码DRY&amp;给出特定头文件的输出,如下所示:
<强>部分强>
#views/elements/_custom_header.rb
<% content_for :header_includes do %>
<% headers.each do |type, value| %>
<% if type == "java" %>
<%= javascript_include_tag value %>
<% else %>
<%= stylesheet_link_tag value %>
<% end %>
<% end %>
<% end %>
查看强>
#views/profiles/index.html.erb
<%= render :partial => 'elements/custom_header', locals: { :headers => [["java", "profile_custom"], ["stylsheeet", "profile_custom"]] } %>
#Resume standard view code here
<强>布局强>
#layouts/default.rb
<html>
<head>
<title>Site Title</title>
<%= javascript_include_tag "https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" %>
<%= javascript_include_tag "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js" %>
<%= javascript_include_tag "application" %>
<%= stylesheet_link_tag "main" %>
<%= stylesheet_link_tag "reset" %>
<%= yield :header_includes %>
<%= csrf_meta_tag %>
</head>
<body>
<%= yield %>
</body>
</html>
我没有测试将部分本地传递为散列,因此语法可能不正确,但这是我们要加载所需代码的方法。额外的好处是content_for只生成已定义的内容(I.E您只需要包含yield :custom_headers
,它只会显示内容块是否存在)