组织Rails视图,以便它易于阅读

时间:2013-04-15 08:54:20

标签: ruby ruby-on-rails-3 model-view-controller

我有以下代码

<% @data1.results.map do |s|%>
    <%if params[:data1].empty? == true%>
        s.product.text
            <!-- More content to come-->
    <%else%>
        <% if s.text.include?(params[:data1])%>
            <!--Skip over -->
        <%else%>
            s.product.text
                    <!-- More content to come-->
    <%end%>
        <%end%>
<%end%>

现在你可以看到

s.product.text
<!-- More content to come-->

重复。我刚刚粘贴了两条线,但将来会有更多。现在我想知道将代码放在那里而不重复或让视图不舒服的简洁方法是什么?也许用Proc?但是怎么样?我试过帮助它但没有工作

我有类似

的东西
@proc = Proc.new {
    s.product.text
    <!-- More content to come-->
}

但当我执行@proc.call时,它会给我一个no method error

感谢任何帮助或建议。 感谢

3 个答案:

答案 0 :(得分:1)

您可以将s.product.text <more content>置于局部,并在需要时从两个位置渲染。

有关详细信息:http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials

答案 1 :(得分:1)

您可以将这两个条件结合起来,以便不再重复。

<%if !params[:data1].empty? && s.text.include?(params[:data1]) %>
   <!--Skip over -->
<%else%>
   s.product.text
   <!-- More content to come-->
<%end%>

但是在视图中包含复杂的条件并不是一个好主意,所以我建议将其推送到帮助器中,然后您的视图看起来像

<%if show_thing?(s) %>
   s.product.text
   <!-- More content to come-->
<% else %>
   <!--Skip over -->
<%end%>

你的助手看起来像

def show_thing?(s)
  params[:data1].empty? || !s.text.include?(params[:data1])
end

如同其他一些答案所暗示的那样,将产品呈现的内容推送到局部可能仍然是一个好主意。如果您始终为产品呈现相同的标记,您甚至可以将其缩短为

<%if show_thing?(s) %>
   <%= render  s.product %>
<% else %>
   <!--Skip over -->
<%end%>

将使products / _product为partial,将局部变量product设置为s.product。

答案 2 :(得分:0)

这应该有效。顺便说一句,你应该使用每个循环,除非你想修改数组。

<% @data1.results.each do |s|%>
  <% if params[:data1].empty? == true%>
    <%= render :partial => 'partial_name', :locals => { :text => s.product.text }
  <% else%>
    <% if s.text.include?(params[:data1])%>
        <!--Skip over -->
    <%else%>
        <%= render :partial => 'partial_name', :locals => { :text => s.product.text }
    <%end%>
  <%end%>
<%end%>

现在您可以在部分

中使用局部变量'text'