User と House の 2 つのモデルがあります。それらには 1 対 1 の関連付けがあります。
class User < ActiveRecord::Base
attr_accessible :name, :house_attributes
has_one :house, :dependent => :destroy
validates :name, :presence => true
accepts_nested_attributes_for :house, allow_destroy: true, :reject_if => lambda { |a| a['desc'].blank? }
end
class House < ActiveRecord::Base
attr_accessible :desc, :price
belongs_to :user
validates :desc, :presence => true
end
ここで、次のように User new ビュー内にネストされたフォームを作成しました。
<%= simple_form_for(@user) do |f| %>
<%= f.input :name %>
<%= f_builder.simple_fields_for :house, @house do |h| %>
<%= h.input :price %>
<%= h.input :desc %>
<% end %>
<%= f.button :submit %>
<% end %>
そして新しいコントローラーはこんな感じ
def new
@user = User.new
@house = @user.build_house
respond_to do |format|
format.html # new.html.erb
end
end
ユーザーの作成と同時に家を常に作成したい。そのため、家が検証に失敗した場合、ユーザーを作成するべきではありません。(現在、家のモデルには :desc フィールドが存在する必要があるという 1 つの検証しかありません。)
:desc が空白の場合、モデル内のコードのみ、ギャランティ ハウスは作成されません。ただし、それでもユーザーは作成されます。
User モデル内にカスタム検証を追加しようとしましたが、User モデル内の :desc 属性 (self.desc の呼び出しに失敗) または :house_attributes (self.house_attributes) にアクセスする方法が見つかりません。家が作成される前に、レールがこれらの家の属性をどこに保存するのか、私には本当にわかりません。
皆さんが私に素敵で明確な方法を理解するのを手伝ってくれることを願っています
1) :desc 属性のエラー メッセージを検証して表示できるようになりました。現在、エラー メッセージは User モデルの :name フィールドに対してのみ表示されます。
2) ユーザーまたは家の検証が失敗した場合、ユーザーを保存しないでください。
3) いずれかの検証が失敗した場合は、:new をレンダリングします。
ありがとう