我目前正在尝试使用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
。我不明白为什么它不起作用。
答案 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哈希都已通过,表单可以在构建新订单项时找到正确的照片。