0

我有以下代码

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

但是当我做 a@proc.call它给了我一个no method error.

任何帮助或建议表示赞赏。谢谢

4

3 回答 3

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 部分,将局部变量 product 设置为 s.product。

于 2013-04-15T12:34:20.603 回答
1

您可以将它s.product.text <more content>放在一个部分中,并在需要时从两个地方渲染它。

欲了解更多信息: http: //guides.rubyonrails.org/layouts_and_rendering.html#using-partials

于 2013-04-15T08:56:16.843 回答
0

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

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

现在您可以在局部变量中使用局部变量“文本”

于 2013-04-15T09:53:21.907 回答