0

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 をレンダリングします。

ありがとう

4

1 に答える 1

3

validates_associated :houseUser モデルに追加する必要があります。これにより、ハウスの検証が実行され、ユーザーが有効であると見なされる前に成功することが保証されます。

于 2013-04-10T04:02:27.933 に答える