0

複数のアドレスを持つユーザー モデルがあります。レールでの私のアプリケーションでは、アドレスは必須ではありません。したがって、誰かがユーザーを作成し、ユーザーが作成された後にアドレスを入力したい場合、私のアプリケーションはそれを許可する必要があります。私の問題は、Address モデルの場合、Address Line 1、City、および Postal Code の検証があることです。これらのフィールドを空白にすることはできません。ユーザーを編集すると、次のコードが失敗します。

user.addresses << Address.new

Rails は新しい Address を作成しようとし、Insert コマンドを起動します。モデルで必要な検証のために、これは失敗します。ユーザーがデータベースに存在しない場合、上記のコードは失敗しません。この問題の解決策の 1 つは、ユーザーのパーシャル編集用に別個の form_for バインディングを作成することです。私はその解決策をしたくありません。データベース内の既存の User オブジェクトに空の Address オブジェクトをバインドできるソリューションはありますか?

4

2 に答える 2

3
user.addresses << Address.new

Address モデルでフィールドを設定する必要がある場合、このコードは機能しません。Address.new

条件付きでアドレスを追加したい場合は、おそらく次のようなものが必要です。

if !params[:address].blank?
  user.addresses.create(params[:address])
end

また

user.addresses << Address.new(params[:address]) unless params[:address].blank

(アドレスのないユーザーを単に作成するのではなく) 各ユーザーに対して「空の」アドレス オブジェクトを本当に作成したい場合は、フィールドが入力された場合にのみ起動するように検証を変更できます。

このようなもの:

class Address < ActiveRecord::Base
  validates_presence_of :address1, :if => :non_empty_address?
  # etc

  private
    def non_empty_address?
     !address1.blank? || !address2.blank || !city.blank? # etc
    end
end

restful_authentication プラグインは、同様のアプローチを使用して、ユーザーのパスワードが必要かどうかを判断します。

于 2008-12-31T00:59:48.383 に答える
3

空の Address オブジェクトを user.addresses コレクションに追加しようとするのはなぜですか? 私はあなたが単に次のようなことをすることができると思います:

user.addresses << Address.new unless (conditions)

残念ながら、あなたの条件がここにあるのかわかりませんので、次のようなものかもしれません

user.addresses << Address.new unless params[:address].nil?

...私の推測では、空白の Address.new を渡すだけでなく、実際の Address オブジェクトがあると思います...

于 2008-12-30T21:05:28.090 に答える