【问题标题】:Rails render partial without entire html layoutRails 在没有整个 html 布局的情况下呈现部分内容
【发布时间】:2012-04-09 00:27:48
【问题描述】:

好的,所以我在使用 rails 和渲染局部时遇到了问题。我有一个名为 profile 的布局,在 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>

上面的yi​​eld标签(profile/index.html.erb)里面是这样的

<%= render :partial => 'pages/page', :layout => "layouts/default", :locals => {:page => @page } %>

现在在页面/页面视图中有相同的默认标签,例如 css 和 js 文件。当我删除 css 样式时,我会丢失页面/页面视图的样式。有没有一种方法可以在不调用相同的 css 和 js 文件的情况下渲染部分内容,或者有什么更好的方法来做类似的事情?

【问题讨论】:

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


    【解决方案1】:

    我很少看到(或者我想知道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】:

      您需要选择其中之一:布局原始方法调用,或将布局传递给部分。两者都做是不合逻辑的。

      这里有更彻底的讨论:

      http://www.mikemayo.org/2012/rendering-a-collection-of-partials-with-content_for

      【讨论】:

        【解决方案3】:

        我总是按如下方式创建覆盖样式表的选项:

        <%= 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 标记和头部等的布局内渲染部分内容。您可能应该调查是否有更好的方法来做您正在做的事情。

        【讨论】:

          【解决方案4】:

          partial 基本上只是一个“页面切片”(就像一块蛋糕......但采用代码形式)。它旨在填充页面的一小部分;通常会根据页面变量动态更新。


          在我看来,您似乎混淆了布局、视图和部分的目的。如果您想动态加载 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 %>
          

          部分

          Partials 可用于保持代码 DRY 并提供特定头文件的输出,如下所示:

          部分

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-23
            • 2020-12-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-29
            • 2012-04-06
            • 2013-04-03
            相关资源
            最近更新 更多