0

我现在有一个部分看起来像这样:

<%= render(:partial => 'order', :object => Order.new %>

如何将一些空 LineItem 对象构建到 Order.new 中,如 :object => Order.new?

请注意 Order has_many :line_items。和 LineItem belongs_to :order

正如评论者所提到的,这乍一看似乎违反了 MVC 设计,但我忘了提到这个渲染实际上是在一个 link_to_function 帮助器中,它用于动态插入属性行项目的更多字段。

实际的助手看起来像这样:

#orders_helper.rb
  def add_line_item_link(name, form_scope)
    link_to_function name, :class => "add_line_item_link" do |page|
      line_item_html = render(:partial => 'line_item', :object => @order.line_items.new, :locals => {:f => form_scope})
      page << %{
        var time_index = new Date().getTime();
        var line_item_html = #{line_item_html.to_json};
        line_item_html = line_item_html.replace(/_\\d+/g, "_"+time_index);
        line_item_html = line_item_html.replace(/\\[\\d+\\]/g, "\\["+time_index+"\\]");
        $('line_items').insert({bottom: line_item_html});
      }
    end
  end

@order.line_items.new 是我喜欢的工作:

第一:我想要在@order 对象中构建一个 line_item 而不是一个 line_item,我想要三个。第二:订单项有一个名为“标题”的属性,每当我们收到订单时,几乎每次订单都有三个订单项,一个有标题编辑器,一个有标题摄影师,一个有标题视频编辑器。

所以我想,也许我可以这样:

#orders_controller.rb
@titles = %w(editor photographer video-editor)

#orders_helper.rb
...#same as above
:partial => 'line_items', :collection => lambda { @titles.each {|t| @order.line_items.build(:title => t) } return @order.line_items}
...

有什么建议么?谢谢你

4

3 回答 3

1

重构马特的答案:

def default_line_items
  line_items.build %w(editor photographer video_editor).collect { |i| {:title => i } }
end

一条线。做同样的事情。

于 2009-12-12T03:49:04.560 回答
0

回应你改变的问题——

#order.rb
def default_line_items
  self.line_items.build(:title => "editor")
  self.line_items.build(:title => "photographer")
  self.line_items.build(:title => "video_editor")
  return self.line_items
end
#call to partial
render (:partial => "line_item", :collection => order.default_line_items)
于 2009-12-11T05:21:04.607 回答
0

对不起,但这对我来说是一种严重的代码气味。违反 MVC 原则。View 层不应该与 Model 层直接交互。

于 2009-12-11T05:27:17.817 回答