【问题标题】:Rails partial renderingRails 部分渲染
【发布时间】:2011-03-08 13:45:34
【问题描述】:

根据当前控制器渲染局部的最佳方法是什么?
例如,我们有这个部分:
<h2>Funny <em>title</em></h2> 根据控制器,我想将 <em> 更改为 <strong>
我们可以通过将局部变量传递给部分并使用条件来做到这一点:
<% if :controller == "something" tag="em" elsif :controller == "other" tag="strong" %>
<h2>Funny <<%= tag %>>title</<%= tag %>></h2>

但是如果有 n 个控制器呢?这么多条件看起来不太好。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我会在 before_filter 中设置一个实例变量,然后在部分中抓取它。

    例如,在您的控制器中:

    class FooController ...
      before_filter set_subtitle_flag
    
      ...
    
      private
    
      def set_subtitle_flag
        @subtitle_strong = true
      end
    end
    

    然后在你的部分:

    <% if @subtitle_strong %>
      <strong>Foo bar baz</strong>
    <% else %>
      <em>Foo bar baz</em>
    <% end %>
    

    【讨论】:

    • 这是最好的选择。检查视图中的控制器正在破坏 MVC。如果重命名控制器怎么办?如果你想从另一个控制器使用这个视图怎么办?这两者都会导致您的逻辑失败,但实例变量不会。
    【解决方案2】:

    一种选择是不使用服务器端逻辑,而是使用 CSS。

    代替:

    <h2>Funny <em>title</em></h2>
    

    您可以将标题包装在 span 标记中,并根据您的控制器名称使用动态 CSS 类名称设置样式:

    <h2>Funny <span class="<%= title_class %>">title</span></h2>
    

    将控制器名称作为名为“title_class”的局部变量传递给局部变量,并使用 CSS 选择器变体来匹配样式表中的这些名称。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2017-05-07
    • 2017-06-01
    • 2013-06-24
    • 2011-02-26
    • 2012-10-16
    • 2019-09-07
    相关资源
    最近更新 更多