2010-11-13 29 views
2

En supposant que le Post - modèle Comment avec les ressources imbriquées:formulaire_for avec association - comment fournir l'ID parent?

resources :posts do 
    resources :comments 
end 

Comment le app/views/comments/_form.html.haml (erb fera aussi bien) ressembler à de sorte qu'il fournit également id du poste pour attacher le commentaire à?

Pour l'instant, je sais que l'ajout d'une entrée masquée à l'identifiant de publication est manuel. Cela me semble sale.

Y a-t-il un meilleur moyen? Je m'attendais à ce que les rails comprennent la ressource imbriquée et incluent automatiquement le post_id comme entrée cachée.

= form_for [@post, @comment] do |f| 
    .field 
    f.label :body 
    f.text_field :body 
    hidden_field_tag :post_id, @post.id 
    .actions 
    = f.submit 'Save' 

EDIT: Utilisation de Mongoid, pas ActiveRecord.

Merci.

Répondre

4

L'ID de la publication sera en fait dans l'URL. Si vous tapez rake routes dans le terminal/console, vous verrez que le motif de votre ressource imbriquée est défini comme tel:

POST /posts/:post_id/comments {:controller=>"comments", :action=>"create"} 

Jetez un coup d'oeil au HTML qui est craché par la méthode form_for et regarder spécifiquement à l'adresse action de l'étiquette <form>. Vous devriez voir quelque chose comme action="/posts/4/comments".

En supposant que vous avez défini resources :comments seulement une fois dans votre routes.rb, en tant que ressource imbriquée de resources :posts, alors il est sûr pour vous de modifier l'action CommentsController#create en tant que tel:

# retrieve the post for this comment 
post = Post.find(params[:post_id]) 
comment = Comment.new(params[:comment]) 
comment.post = post 

Ou vous pouvez simplement passer params[:post_id]-comment par exemple comme ceci:

comment.post_id = params[:post_id] 

J'espère que cela aide.

Pour plus d'informations sur les formulaires imbriqués/modèles, je vous recommande de regarder les Railscasts suivants:

+0

De plus, si vous finissez par avoir à le faire souvent, les inherited_resources gem automatise beaucoup de gestion d'association pour vous: https://github.com/josevalim/inherited_resources – Dominic

+0

Est-il censé fonctionner avec Mongoid ainsi que? –