【问题标题】:Rendering a collection of different classes in Rails在 Rails 中渲染不同类的集合
【发布时间】:2012-11-21 17:49:13
【问题描述】:

我有一个包含几个不同类的实例的集合,我想为每个实例呈现部分。我可以使用以下代码来做到这一点:

<%= render @results %>

我的问题是:如何在不同的基本目录中呈现不同的部分?上面的代码将查找 app/views/stories/_story.html.erb,但是,此操作的部分内容都保存在不同的目录中 - app/search/_story.html.erb。有什么方法可以指定吗?

【问题讨论】:

    标签: ruby-on-rails partials


    【解决方案1】:

    你可以像这样创建一个辅助方法:

    def render_results(results)
      result_templates = {"ClassA" => "search/story", "ClassB" => "something/else"}
      results.each do |result|
        if template = result_templates[result.class.name]
          concat render(:partial => template, :object => result)
        end
      end
    end
    

    然后在视图中调用&lt;% render_results(@results) %&gt;

    【讨论】:

      【解决方案2】:

      或者你可以使用 is_a?(Object)

      if is_a?(classA)
       render something_A
      elsif is_a?(classB)
        render something_B
      end
      

      【讨论】:

        【解决方案3】:

        我有一个类似的情况,我有多个类,所以我为每个类使用一个部分,例如:

        for result in @results
          = render :partial => "result_#{result.class.to_s.downcase}", :locals => {:item => result}
        end
        

        【讨论】:

        • 这是我用于多模型搜索结果的方法,但有一个区别:如果您通过 :collection 传入 @results 而不是使用本地变量和 foreach 块,则每个对象被分配给其部分的partialname 变量。这避免了像“item”(无意冒犯!)这样的抽象变量散布在不同类的视图上下文中,并保留了语义,例如school.addressitem.addressschool 部分内。如果您不想使用默认的classnames/_classname 部分位置,那就有点复杂了。
        猜你喜欢
        • 1970-01-01
        • 2020-04-18
        • 1970-01-01
        • 2015-10-22
        • 1970-01-01
        • 2013-09-08
        • 2023-03-21
        • 1970-01-01
        相关资源
        最近更新 更多