0

大约一个星期以来,我一直在尝试渲染视图。我有一个需要能够导出集合的应用程序,因此我决定使用在 Web 浏览器中呈现为 a.txt和的 line partial 。.csv到目前为止,在让整个集合渲染(逐行)方面做得很好。但是,我无法让某些集合对象(在本例中为产品)根据某个属性(大小元素)复制自己。

下面的代码是我现在陷入困境的地方

控制器

class PexportController < ApplicationController
  layout 'csv'

  def index
  end

  def show
    @feed_template = params[:id]
    @products = Product.find :all
    @products.each do |product|
      unless product.size.nil? || product.size.empty? || product.size.kind_of?(Fixnum)
        @products << new_products_for(product)
      end
    end

    respond_to do |format|
      format.html
      format.text
    end
  end

  private

  def new_products_for(product = {})
    products = Array.new
    product.size.each do |p|
      products << Product.new(p.attributes)
    end
    products
  end
end

看法

<%= render partial: 'pexport/p', collection: @products %>

部分的

<%= p.sku %>  <%= p.name %> <%= p.price %> ......

我基本上只需要让控制器方法工作。我用于行复制器的属性 :size 只是一个像这样的数组[1,2,3]。而且我希望包含此尺寸属性的产品根据其尺寸数组中的尺寸数量来复制自己。我什至不确定我是否要马上去做,但它已经到了我要绕圈子的地步,所以我想我会发布它。

4

2 回答 2

0

如果我了解您在做什么,您有一个产品列表,但如果其中一些产品条目有多个尺寸,则它们应该显示为多个产品。假设这是正确的,您的逻辑有点偏离:new_products_for返回一个数组,该数组作为单个元素添加到数组末尾@products。所以你的部分将不知道如何处理它。你可以尝试这样的事情:

@my_products = Product.find :all
@products = []
@my_products.each do |p|
  if p.size.blank? || p.size.kind_of?(Fixnum)
    @products << p 
  else
    @products += new_products_for(p)
  end
end

另外,我建议您使该Product.new行更明确:

products << Product.new(:sku => p.sku, :name => p.name, ...)

p.attributes将为您提供模型的所有属性,包括id, created_atupdated_at这可能会干扰您正在做的事情。

于 2012-04-07T17:13:41.017 回答
0

替代答案:是否有某些原因需要在控制器中复制整个对象?您可以通过在您的视图中执行以下操作来简化事情:

<% if p.size.is_a?(Array) %>
  <% p.size.each do |s| %>
    <%= p.sku %>  <%= p.name %> <%= p.price %> <%= s %>
  <% end %>
<% else %>
  <%= p.sku %>  <%= p.name %> <%= p.price %> <%= p.size %>
<% end %>

或者类似的东西。

于 2012-04-07T18:19:06.233 回答