0

私のアプリケーションにはUsersとがありDwellingsます。がuserを作成するとdwelling、は Rails 関連付けを介して のにuserなります。私の方法では、は列で新しく作成された に正常に割り当てられますが、 はのレコードのに伝播されません。関係なのか、メソッドの設定が間違っているのかわかりませんが、が正常に作成されているため、 を保存しようとすると問題が発生するようです。以下は私のモデルとメソッドの実装です。ownerdwellingcreateuser_iddwellingowner_iddwelling_iddwelling_iduseruserdwelling

住居モデル

# dwelling.rb
class Dwelling < ActiveRecord::Base
  attr_accessible :street_address, :city, :state, :zip, :nickname

  belongs_to :owner, :class_name => "User", :foreign_key => "owner_id"
  has_many :roomies, :class_name => "User"

  validates :street_address, presence: true
  validates :city, presence: true
  validates :state, presence: true
  validates :zip, presence: true

end

--

ユーザーモデル

# user.rb
class User < ActiveRecord::Base
  attr_accessible :email, :first_name, :last_name, :password, :password_confirmation, :zip
  has_secure_password

  before_save { |user| user.email = email.downcase }
  before_save :create_remember_token

  belongs_to :dwelling
  has_many :properties, :class_name => "Dwelling", :foreign_key => "owner_id"
...

--

Dwellings Controller (create メソッド)

# dwellings_controller.rb
def create
  @dwelling = current_user.properties.build(params[:dwelling])

  if @dwelling.save
    current_user.dwelling = @dwelling
    if current_user.save
      flash[:success] = "Woohoo! Your dwelling has been created. Welcome home!"
    else
    flash[:notice] = "You have successfully created a dwelling, but something prevented us from adding you as a roomie. Please email support so we can try to correct this for you."
    end
    redirect_to current_user
    else
    render 'new'
  end
end

--

上記のように、dwellingは正常に作成されますが、「...しかし、何かがあなたをルーキーとして追加できませんでした...」というフラッシュがelse条件からトリガーされます。

2012 年 8 月 3 日午後 9 時 11 分更新

トランザクションを強制するcreateために使用するアクションを更新しました。user.save!以下のエラーが出力されました。どういうわけかパスワードが必要なようです。

ActiveRecord::RecordInvalid in DwellingsController#create

Validation failed: Password can't be blank, Password is too short (minimum is 6 characters), Password confirmation can't be blank
4

3 に答える 3

1

更新: 明確にするために、以下の回答でユーザーと住居の関係を誤解していたため、これは問題の解決策ではありません。


アソシエーションの仕組みを誤解していると思います。belongs_to/関係では、(この場合は) に属するhas_manyモデルのみが、他のレコードを指す外部キーを持ちます (この場合は、外部キーを介して)。もう一方のレコード ( ) は、関連付けごとにキーを必要としないため、冗長になります。DwellingUserowner_idUser

同様に、 に割り当てる必要@dwellingcurrent_user.dwelling、 を保存する必要もありませんcurrent_user@dwelling組み込み後はセーブcurrent_user.properties.build(params[:dwelling])するだけで十分です。

于 2012-08-05T00:35:40.763 に答える
0

これは、の保存に関する問題でしたusercreateコントローラーのアクションを更新して、 usingDwellingsの保存を強制し、アプリケーションを中断して明示的なエラーを取得しました。Railsは、(およびパスワードの長さ)が欠落していることを訴えました。モデルの検証と同様に、両方の検証を実施しています。これらの検証を更新して、にのみ適用されるようにしました。これで問題は解決しました。検証が実施されなくなったため、はレコードに正常に追加されました。新しく実装されたコードは以下のとおりです。useruser.save!passwordpassword_confirmationpresencepasswordpassword_confirmationlengthpasswordUsercreateuser.savedwelling_iduser

#dwellings_controller.rb
...
def create
  @dwelling = current_user.properties.build(params[:dwelling])

  if @dwelling.save
    current_user.dwelling = @dwelling
    if current_user.save
      flash[:success] = "Woohoo! Your dwelling has been created. Welcome home!"
    else
      flash[:notice] = "You have successfully created a dwelling, but something prevented us from adding you as a roomie. Please email support so we can try to correct this for you."
    end
    redirect_to current_user
    else
      render 'new'
    end
  end
...

-

#user.rb
...
  validates :password, presence: { :on => :create }, length: { minimum: 6, :on => :create }
  validates :password_confirmation, presence: { :on => :create }
于 2012-08-06T15:03:35.293 に答える
0

正確な問題は、まだ見ていないアプリケーションの詳細に大きく依存します。たとえば、何current_userが定義されているか、ユーザーがどのように作成されているか、フォームの詳細などはわかりません。

現時点ではこれ以上作業する時間はありませんが、次のことを試してみてください。

  1. まず、モデルから削除has_secure_passwordして、まだ問題が発生するかどうかを確認してください。User最終的には再度追加する必要があるため、これはトラブルシューティング用ですhas_secure_password

  2. password_digestusers テーブルに列があることを確認してください。

  3. 機能を追加する前にユーザーを作成した可能current_user性があるため、ユーザー テーブルに の値があることを確認してください。これにより、 の値が NULL になります。password_digesthas_secure_passwordpassword_digest

  4. current_user実際に永続化された (データベース内の) ユーザーであることを確認してください。これを行うには、上記の次の行を追加しますcurrent_user.save!

    raise StandardError, "current_user is not persisted" unless current_user.persisted?
    
  5. current_user永続ユーザーとして既に存在すると想定しています。ユーザーと住居を同じ形式で作成しようとするなど、実際に何か凝ったことをしている場合は、考慮すべき他の要素がいくつかあります。

しばらくの間、これを手伝う時間がありません。それが解決されることを願っています。

于 2012-08-05T03:22:45.600 に答える