ruby-on-rails-3 - anidados - formularios en ruby on rails
Construyendo un atributo anidado de mĂșltiples objetos padre (2)
No.
Puedes intentar esto
link_to "New ...", polymorphic_url([:new, @order, :order_item], :photo_id => photo.id)
o link_to
vieja link_to
link_to "New ...", new_order_order_item(@order, :photo_id => photo.id)
Actualmente estoy intentando usar link_to
con un método de ayuda que crea enlaces para crear elementos dinámicamente, en lugar de utilizar los métodos new_object_path
. Rails 3 permite URL polimórficas, que fl00r me ayudó a identificar y usar en la forma que estaba buscando originalmente. Sin embargo, si se usa el método polymorphic_url
Rails como se muestra aquí, se pasa el argumento en la solicitud http, el campo de formulario relacionado en la página devuelta no se rellena y no se establece. Estoy intentando crear un order_item
partir de un order
que también se order_item
partir de una photo
.
¿Alguien ve lo que está mal aquí? El código relacionado está a continuación:
# 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
Aquí está la pregunta original:
Estoy intentando crear un enlace para crear un [:new, @order, @order_item]
donde @order_item.photo_id
se puede pasar en el enlace.
Ahora, no estoy seguro si eso tiene mucho sentido, así que trataré de aclarar mi problema aquí.
Por lo que he visto, Rails 3 tiene una sintaxis newish para vincular acciones de recursos usando una matriz estructurada como [:action, object]
o para recursos profundamente anidados, [:action, parent, child]
. Para este ejemplo en particular, estoy usando link_to [:new, @order, :order_item]
. Estos botones se adjuntarán a cada foto en una galería de fotos.
¿Es posible pasar el id
de la foto como el atributo photo_id
del nuevo artículo de pedido?
Hasta ahora he intentado link_to [:new, @order, :order_item], :photo_id => photo.id
, pero parece que no funciona. También intenté poner :photo_id
en un hash explícito. ¿Hay alguna manera de seguir esta nueva sintaxis y lograr esta funcionalidad?
Actualización: realmente espero encontrar algo como:
link_to "new photo", [:new, @order, :order_item => {:photo_id => photo.id}]
donde estoy haciendo algo parecido a: construir pero con más que solo los atributos del modelo de generador que se está suministrando.
ACTUALIZACIÓN 11 de abril 2011 Lo tengo trabajando donde puedo pasar un atributo en una solicitud de obtención utilizando polymorphic_url
como se ve a continuación:
# 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
Parece que debería estar funcionando. Puedo ver la solicitud de obtención que parece funcionar como se esperaba:
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"}
y la url es la esperada, pero la forma no parece captar esa variable de la url.
El: order_id funciona. El: photo_id, sin embargo, no parece llevar a la nueva página OrderItems #. text_field
un text_field
para :photo_id
, y está vacío cada vez. Está en el attr_accessible
. No veo por qué no está funcionando.
Finalmente me di cuenta de esto.
En mi nueva acción OrderItemsController #, mi función de build
no tomaba parámetros o params[:order_item]
como parámetro. Como el parámetro pasado desde polymorphic_url
no estaba realmente relacionado con ningún objeto, sino que era solo un atributo en bruto, intenté simplemente pasar todo el hash de params
a la función de compilación. Trabajado como un encanto. Entonces estoy usando este código para el enlace:
= add_cart_button_for [current_order, :order_item], :photo_id => photo.id
y este código en mi controlador:
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
Ahora que se está aprobando todo el hash de params, el formulario puede encontrar la foto correcta al crear el nuevo artículo de pedido.