идентификатор ассоциации не устанавливается с использованием accepts_nested_attributes_for и Decent_Exposure

Когда я публикую форму для создания нового запроса с дочерним комментарием (в приложении запросы могут иметь несколько комментариев), комментарий не создается. Это работает, когда удаляются проверки присутствия. Так что это связано с порядком, в котором вещи строятся и сохраняются. Как сохранить проверки и сохранить код в чистоте?

(Ниже приведен пример, поэтому он может быть не совсем работоспособным)

модели/запрос.рб

class Inquiry < ActiveRecord::Base
  has_many :comments
  accepts_nested_attributes_for :comments

модели/комментарий.рб

class Comment < ActiveRecord::Base
  belongs_to :inquiry
  belongs_to :user
  validates_presence_of :user_id, :inquiry_id

контроллеры/inquiry_controller.rb

expose(:inquiries)
expose(:inquiry)

def new
  inquiry.comments.build :user => current_user
end

def create
  # inquiry.save => false
  # inquiry.valid? => false
  # inquiry.errors => {:"comments.inquiry_id"=>["can't be blank"]}
end

просмотры/запросы/new.html.haml

= simple_form_for inquiry do |f|
  = f.simple_fields_for :comments do |c|
    = c.hidden_field :user_id
    = c.input :body, :label => 'Comment'
= f.button :submit

схема базы данных

create_table "inquiries", :force => true do |t|
  t.string   "state"
  t.datetime "created_at"
  t.datetime "updated_at"
end
create_table "comments", :force => true do |t|
  t.integer  "inquiry_id"
  t.integer  "user_id"
  t.text     "body"
  t.datetime "created_at"
  t.datetime "updated_at"
end

person linojon    schedule 24.09.2011    source источник
comment
Пожалуйста, покажите миграции, которые создают эти таблицы, или, если они не созданы через миграции, покажите описания базы данных.   -  person Michael Durrant    schedule 24.09.2011
comment
хорошо, я добавил выдержку из schema.rb   -  person linojon    schedule 25.09.2011


Ответы (1)


По сути, перед сохранением вы также проверяете наличие query_id, связи возврата от комментария к запросу, которую нельзя установить, пока комментарий не будет сохранен. Альтернативный способ добиться этого и сохранить ваши проверки неповрежденными:

comment = Comment.new({:user => current_user, :body => params[:body]
comment.inquiry = inquiry
comment.save!
inquiry.comments << comment
inquiry.save!

Или альтернативный способ был бы

= simple_form_for inquiry do |f|
  = f.simple_fields_for :comments do |c|
    = c.hidden_field :user_id
    = c.hidden_field :inquiry_id, inquiry.id
    = c.input :body, :label => 'Comment'
= f.button :submit

В основном добавляя следующую строку в форму комментариев

    = c.hidden_field :inquiry_id, inquiry.id
person Kamesh Rao Yeduvakula    schedule 20.06.2012