【问题标题】:Complex Rendering in RailsRails 中的复杂渲染
【发布时间】:2012-04-07 16:44:30
【问题描述】:

大约一个星期以来,我一直在尝试获取要渲染的视图。我有一个需要能够导出集合的应用程序,因此我决定使用在 Web 浏览器中呈现为 .txt 和 .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] 这样的数组。而且我希望包含此尺寸属性的产品根据其尺寸数组中的尺寸数量来复制自己。我什至不确定我是否要马上去做,但它已经到了我要绕圈子的地步,所以我想我会发布它。

【问题讨论】:

  • 你的unless 语句很奇怪,因为如果它是Fixnum,它会在检查它之前抛出一个NoMethodError,因为Fixnum 没有empty?.

标签: ruby-on-rails ruby ruby-on-rails-3 mongodb mongoid


【解决方案1】:

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

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

或类似的东西。

【讨论】:

  • 这是我最初走的路线,只是无法让它发挥得很好。我可以替换“ ”和“ " 有两个不同的部分?............即。 和
  • 我想是的,虽然这似乎是不必要地重复代码。在您的问题中提供更多细节确实会有所帮助,也许还有更多关于您想要做什么的背景信息(例如,为什么 size 属性是一个数组,以及为什么这意味着您需要为它复制产品)。
  • 对于某些数据馈送格式,产品选项(在这种情况下为大小)必须在 csv 或 txt 输出中有自己的行。假设您有尺寸为 1、2、3 的产品 xyz。提要的输出必须类似于 |row 1|产品 xyz 尺寸 1 |第 2 行|产品 xyz 尺寸 2 |第 3 行|产品 xyz 尺寸 3 ......并且提要将不断迭代所有产品,如果它包含尺寸属性数组中的任何值,则会复制自身。就上下文而言,当我说提要时,我指的是 google、amazon、ebay 等 3rd 方渠道。
  • 另外我有一个带有 的 show.text.erb 文件来分隔各种提要....例如 _amazon。 text.erb 将具有所有亚马逊提要标题,而 _p.text.erb(行部分)将具有属于这些标题列中的所有变量
  • 我后退了一步,停止了复杂的事情,并将您的代码卡在 和 .. 工作得像个魅力。非常感谢您的帮助和耐心。周末愉快!
【解决方案2】:

如果我了解您在做什么,您有一个产品列表,但如果其中一些产品条目有多个尺寸,则它们应该显示为多个产品。假设这是正确的,您的逻辑有点偏离:new_products_for 返回一个数组,该数组作为 single element 添加到您的@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_at、updated_at,它们可能会干扰您正在做的事情。

【讨论】:

  • 非常感谢您的洞察力和快速回复。我忘了提到我有另一个视图文件 ""....我认为涵盖了您提到的 Product.new 产品线?
  • 基本上有大约 200 个属性,所以我用标题制作了一个模板,然后每行都有一个部分
  • 你是 ruby​​ 新手,嘿?当您学习该语言时,您会发现许多有助于简化代码的简洁细节。例如。整个视图可以通过&lt;%= [my_product.name, my_product.sku, my_product.price].join(", ") %&gt; 完成。
  • 是的,只有大约 5-6 个月。感谢您的注意 =) 大声笑...但是我确实尝试了与您的示例视图类似的东西,但遇到了问题,因为我有多个需要的导出模板以多种格式呈现(某些产品甚至需要不同的标题、特定类别的格式)。我发送的最后一行是针对我在制表符分隔的 txt 视图中遇到的问题的补丁。
  • 好的,我认为您需要为您的问题添加更多细节。没有所有信息,很难提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 2016-08-25
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
相关资源
最近更新 更多