J'ai une question en deux parties sur form_for et les ressources imbriquées. Disons que j'écris un moteur de blog et que je souhaite relier un commentaire à un article. J'ai défini une ressource imbriquée comme suit:
map.resources :articles do |articles|
articles.resources :comments
end
Le formulaire de commentaire se trouve dans la vue show.html.erb pour les articles, sous l'article lui-même, par exemple comme ceci:
<%= render :partial => "articles/article" %>
<% form_for([ :article, @comment]) do |f| %>
<%= f.text_area :text %>
<%= submit_tag "Submit" %>
<% end %>
Cela donne une erreur, "Called id for nil, qui serait par erreur etc." J'ai aussi essayé
<% form_for @article, @comment do |f| %>
Ce qui rend correctement mais relie f.text_area au champ 'text' de l'article au lieu du commentaire, et présente le html de l'attribut article.text dans cette zone de texte. Il me semble donc que je me trompe également. Ce que je veux, c'est un formulaire dont 'submit' appellera l'action de création sur CommentsController, avec un article_id dans les paramètres, par exemple une demande de publication à / articles / 1 / comments.
La deuxième partie de ma question est la suivante: quelle est la meilleure façon de créer l'instance de commentaire pour commencer? Je crée un @comment dans l'action show de ArticlesController, donc un objet de commentaire sera dans la portée de l'aide form_for. Ensuite, dans l'action create du CommentsController, je crée un nouveau @comment en utilisant les paramètres transmis depuis form_for.
Merci!
la source
[@result, @course]
fonctionné, maisform_for(@result, url: { action: "create" })
fonctionne aussi. Cela n'a besoin que du dernier nom de modèle et du nom de la méthode.Assurez-vous d'avoir les deux objets créés dans le contrôleur:
@post
et@comment
pour le message, par exemple:Alors en vue:
Assurez-vous de définir explicitement le tableau dans form_for, pas seulement séparés par des virgules comme vous l'avez fait ci-dessus.
la source
Vous n'avez pas besoin de faire des choses spéciales dans le formulaire. Vous venez de créer le commentaire correctement dans l'action show:
puis créez un formulaire pour cela dans la vue de l'article:
par défaut, ce commentaire ira à l'
create
action deCommentsController
, que vous voudrez probablement ensuite insérerredirect :back
pour que vous soyez redirigé vers laArticle
page.la source
form_for([@article, @new_comment])
format. Je pense que c'est parce que je montre la vue pourcomments#new
, nonarticle#new_comment
. Je pense quearticle#new_comment
Rails est assez intelligent pour déterminer dans quoi l'objet de commentaire est imbriqué et que vous n'avez pas à le spécifier?