从多个父对象构建嵌套属性

时间:2011-04-11 05:51:10

标签: ruby-on-rails-3 activerecord webforms link-to

我目前正在尝试使用link_to辅助方法来创建动态创建项目的链接,而不是使用new_object_path方法。 Rails 3允许多态URL,fl00r帮助我以我最初搜索的形式识别和使用。但是,虽然如此处所示使用Rails'polymorphic_url方法确实传递了http请求中的参数,但返回页面上的相关表单字段未填写,并且未设置。我正在尝试从order_item构建一个来自order的{​​{1}} photo

有谁看到这里出了什么问题?相关代码如下:

# the helper method
def add_cart_button_for(arr, attr_hash={})
  link_to button(:cart_add), polymorphic_url( [:new] + arr, attr_hash )
end

# the call in index.html.haml
= add_cart_button_for [current_order, :order_item], :photo_id => photo.id

# _form.html.haml for order_item
- form_for [ @order, @order_item ] do |f|
  %p
    = f.label :photo_id
    %br
    = f.text_field :photo_id

这是原始问题:

我正在尝试创建一个链接来创建[:new, @order, @order_item],其中@order_item.photo_id可以在链接中传递。

现在,我不确定这是否有意义,所以我会在这里澄清我的问题。

从我看到的情况来看,Rails 3有一个新的语法,用于使用结构为[:action, object]的数组或深层嵌套资源[:action, parent, child]链接到资源操作。对于这个特定的例子,我正在使用link_to [:new, @order, :order_item]。这些按钮将附加到照片库中的每张照片。

是否可以将照片的id作为新订单商品的属性photo_id传递?

到目前为止,我已尝试link_to [:new, @order, :order_item], :photo_id => photo.id,但这似乎不起作用。我也尝试将:photo_id置于显式哈希中。有没有办法遵循这种新语法并实现此功能?

更新: 我真的希望找到类似的东西:

 link_to "new photo", [:new, @order, :order_item => {:photo_id => photo.id}]

我在做一个:build,但不仅仅是提供的构建器模型中的属性。

更新 2011年4月11日 我得到了它,我可以使用polymorphic_url将属性传递给get请求,如下所示:

# the helper method
def add_cart_button_for(arr, attr_hash={})
  link_to button(:cart_add), polymorphic_url( [:new] + arr, attr_hash )
end

# the call in index.html.haml
= add_cart_button_for [current_order, :order_item], :photo_id => photo.id

这似乎应该有效。我可以看到似乎按预期工作的get请求:

Started GET "/orders/1/order_items/new?photo_id=130" for 127.0.0.1 at 2011-04-11 18:11:07 -0400
  Processing by OrderItemsController#new as HTML
  Parameters: {"photo_id"=>"130", "order_id"=>"1"}

并且网址符合预期,但表单似乎没有从网址中捕获该变量。

:order_id有效。但是:photo_id似乎没有转移到OrderItems #new页面。我为text_field创建了:photo_id,每次都是空的。它位于attr_accessible。我不明白为什么它不起作用。

2 个答案:

答案 0 :(得分:1)

没有

你可以试试这个

link_to "New ...", polymorphic_url([:new, @order, :order_item], :photo_id => photo.id)

或旧学校link_to

link_to "New ...", new_order_order_item(@order, :photo_id => photo.id)

答案 1 :(得分:0)

我终于想出了这件事。

在我的OrderItemsController#new动作中,我的build函数要么不带参数,要么params[:order_item]作为参数。由于从polymorphic_url传递的参数实际上并不与任何对象相关,而只是一个原始属性,我尝试将整个params哈希传递给构建函数。工作就像一个魅力。所以我将此代码用于链接:

= add_cart_button_for [current_order, :order_item], :photo_id => photo.id

和我控制器中的代码:

def new
  @order_item = @order.order_items.build(params)
end



def create
  @order_item = @order.order_items.build(params[:order_item])
  if @order_item.save
    @order.save
    flash[:notice] = "Successfully created order item."
    redirect_to @order
  else
    render :action => 'new'
  end
end

现在整个params哈希都已通过,表单可以在构建新订单项时找到正确的照片。