6

子コメント付きの新しい問い合わせを作成するためのフォームを投稿すると(アプリでは、問い合わせに複数のコメントを含めることができます)、コメントが作成されません。プレゼンス検証を削除すると機能します。したがって、それは物事が構築され保存される順序と関係があります。検証を保持し、コードをクリーンに保つ方法は?

(以下は例であるため、正確に実行できない場合があります)

models / inquiry.rb

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

models / comment.rb

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

controllers / 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

views / inquiries / 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
4

1 に答える 1

1

基本的に、保存する前に、コメントから照会への戻りの関連付けであるinquiry_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
于 2012-06-20T02:26:42.603 に答える