Tengo una pregunta de dos partes sobre form_for y recursos anidados. Digamos que estoy escribiendo un motor de blog y quiero relacionar un comentario con un artículo. He definido un recurso anidado de la siguiente manera:
map.resources :articles do |articles|
articles.resources :comments
end
El formulario de comentarios se encuentra en la vista show.html.erb para artículos, debajo del artículo en sí, por ejemplo, así:
<%= render :partial => "articles/article" %>
<% form_for([ :article, @comment]) do |f| %>
<%= f.text_area :text %>
<%= submit_tag "Submit" %>
<% end %>
Esto da un error, "Se llamó id para nil, que sería erróneamente etc." También he intentado
<% form_for @article, @comment do |f| %>
Que se procesa correctamente pero relaciona f.text_area con el campo 'texto' del artículo en lugar de los comentarios, y presenta el html para el atributo article.text en esa área de texto. Así que parece que también me equivoco. Lo que quiero es un formulario cuyo 'envío' llamará a la acción de creación en CommentsController, con un id_artículo en los parámetros, por ejemplo, una solicitud de publicación a / articles / 1 / comments.
La segunda parte de mi pregunta es, ¿cuál es la mejor manera de crear la instancia de comentario para empezar? Estoy creando un @comment en la acción show del ArticlesController, por lo que un objeto de comentario estará dentro del alcance de form_for helper. Luego, en la acción de creación de CommentsController, creo un nuevo @comment usando los parámetros pasados desde form_for.
¡Gracias!
fuente
[@result, @course]
funcionó, peroform_for(@result, url: { action: "create" })
también funciona. Esto solo necesita el último nombre del modelo y el nombre del método.Asegúrese de tener ambos objetos creados en el controlador:
@post
y@comment
para la publicación, por ejemplo:Entonces a la vista:
Asegúrese de definir explícitamente la matriz en form_for, no solo separados por comas como lo hizo anteriormente.
fuente
No necesita hacer cosas especiales en el formulario. Simplemente construye el comentario correctamente en la acción show:
y luego haga un formulario para ello en la vista del artículo:
de forma predeterminada, este comentario irá a
create
acción deCommentsController
, que probablemente querrá incluirredirect :back
para que se le redirija a laArticle
página.fuente
form_for([@article, @new_comment])
formato. Creo que esto se debe a que estoy mostrando la vista paracomments#new
, noarticle#new_comment
. Supongo que enarticle#new_comment
Rails es lo suficientemente inteligente como para determinar en qué está anidado el objeto de comentario y ¿no tiene que especificarlo?