不使用完整的HTML布局呈现Rails部分视图

4

好的,我来帮助您翻译关于IT技术的内容。以下是需要翻译的内容:

好的,我在使用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文件的情况下呈现一个partial,或者有更好的方法来完成这样的操作?
4个回答

4
我通常会创建以下选项来覆盖样式表:
<%= stylesheet_link_tag content_for?(:stylesheets) ? yield(:stylesheets) : "application", :debug => Rails.env.development? %>

然后在一个视图中

<% content_for :stylesheets %> some stuff or nothing in here <% end %>

这将让你在一个布局中指定不使用样式表,同样的原则也适用于javascript。
话虽如此,如果你正在渲染一个部分在有html标签和head等的布局中,你应该调查是否有更好的方法来完成你的需求。

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

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 %>

部分视图

部分视图可用于使您的代码更具可重用性,并输出特定标题文件的结果,如下所示:

部分视图

#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

Layout

#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仅产生已定义的内容(即,您只需包含yield:custom_headers,并且它只会在内容块存在时显示)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接