form_for с ассоциацией - как предоставить родительский идентификатор? - PullRequest
2 голосов
/ 13 ноября 2010

Предполагая модель Post - Comment с вложенными ресурсами:

resources :posts do
  resources :comments
end

Как должен выглядеть app/views/comments/_form.html.haml (также будет работать erb), чтобы он также предоставлял идентификаторсообщение, чтобы прикрепить комментарий к?

На данный момент известен только один способ - вручную добавить скрытый ввод с идентификатором сообщения.Это выглядит грязно для меня.

Есть ли лучший способ?Я ожидал, что rails поймет вложенный ресурс и автоматически включит post_id в качестве скрытого ввода.

= 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'

РЕДАКТИРОВАТЬ: Использование Mongoid, а не ActiveRecord.

Спасибо.

1 Ответ

4 голосов
/ 13 ноября 2010

Идентификатор поста будет на самом деле в URL. Если вы введете rake routes в свой терминал / консоль, вы увидите, что шаблон для вашего вложенного ресурса определен так:

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

Взгляните на HTML-код, выделенный методом form_for, и обратите особое внимание на action URL-адрес тега <form>. Вы должны увидеть что-то вроде action="/posts/4/comments".

Предполагая, что вы определили resources :comments только один раз в своем routes.rb как вложенный ресурс resources :posts, тогда вы можете безопасно изменять действие CommentsController#create как таковое :

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

Или вы можете просто передать params[:post_id] в comment экземпляр следующим образом:

comment.post_id = params[:post_id]

Надеюсь, это поможет.

Для получения дополнительной информации о вложенных формах / моделях, я рекомендую посмотреть следующие Railscasts:

...