私はRailsが初めてです。私はユーザーモデルとプロファイルモデルを持つアプリケーションを構築しています。2つのモデルをRailsに関連付ける(ユーザとプロフィール)
は、私はこれらのモデルを関連付けるように:
- ユーザーがアカウントを作成した後、彼は自動的に「プロファイルの作成」ページに送信され、彼が作成したプロファイルは、その特定のユーザに接続されています。
- プロファイルを所有しているユーザーのみが編集できます。
nifty_generatorsを使用してユーザーモデルを生成しました。ユーザーがアカウント作成のために送信を押すと、プロファイルを作成するために彼を「新しいプロファイル」ビューにリダイレクトします。私は、ユーザコントローラのリダイレクトパスを編集してこれを行いました。ユーザーコントローラは次のようになります。
def create
@user = User.new(params[:user])
if @user.save
session[:user_id] = @user.id
flash[:notice] = "Thank you for signing up! You are now logged in."
redirect_to new_profile_path
else
render :action => 'new'
end
end
この仕事をしていたが、問題はアプリがプロファイルはその特定のユーザに接続されていたことを認識していないようでしたということでした。プロファイルを作成することはできましたが、プロファイルとユーザーの間には関係がないようです。
マイプロフィールモデルリスト:belongs_toの:ユーザー
マイUserモデルリスト:_oneがあります
をプロファイル私のroutes.rbをファイルには、次のように一覧表示されます。
map.resources:ユーザー、:にhas_one =>:プロフィール
map.resources:profiles
プロファイルテーブルにuser_idという外部キーがあります。私は基本的に入門ガイドレールから外挿し以下、とprofiles_controller.rbファイルを更新し、ユーザーにプロファイルを接続しようとするには
create_table "profiles", :force => true do |t|
t.integer "user_id"
t.string "name"
t.string "address1"
t.string "address2"
t.string "city"
t.string "state"
t.string "zip"
t.string "phone"
t.string "email"
t.string "website"
t.text "description"
t.string "category"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "users", :force => true do |t|
t.string "username"
t.string "email"
t.string "password_hash"
t.string "password_salt"
t.datetime "created_at"
t.datetime "updated_at"
end
:私のスキーマは、このようになります。私の考えは、私のアプリでは、プロファイルはRails Getting Startedアプリケーションと同じ方法でユーザーに接続し、コメントは投稿に接続します。ここに私のプロファイルコントローラの関連部分があります。それが役立つかどうかは、全体のことを提供することができます。
def new
@user = User.find(params[:user_id])
@profile = @user.profile.build
end
def create
@user = User.find(params[:user_id])
@profile = @user.profile.build(params[:profile])
if @profile.save
flash[:notice] = 'Profile was successfully created.'
redirect_to(@profile)
else
flash[:notice] = 'Error. Something went wrong.'
render :action => "new"
end
は終わり
プロファイルコントローラにこれらの更新を行った後、私はアカウント作成画面に提出したときに、今、私はエラーページにリダイレクトしていますそれは言う:
のActiveRecord :: RecordNotFoundをProfilesControllerに#新しい
、IDこれはすべてのケースを使用して、かなりストレートフォワードRailsのように思える
せずにユーザーが見つかりませんでしたが、どの部分が間違っているのか分かりません。あなたの助けを前もってありがとう!
ありがとう、テイト。私はあなたの助言に従って、私が自分で解決しようとしていたいくつかの間違いに遭遇しました。私は今再び立ち往生している。ユーザーを作成するときにsubmitをクリックすると、私はlocalhost:3000/users/5/profile/newに誘導されます。 しかし、私は言うトレースページ: NoMethodError in ProfilesController#new あなたがそれを期待していないときにあなたはnilオブジェクトを持っています! nil.buildを評価中にエラーが発生しました トレースでは、プロファイルコントローラ - 新しいプロファイルメソッドが壊れています。 DEF新しい @user = User.find(のparams [:user_idを]) @profile = @ エンド アイデアuser.profile.build? – MikeH
これは下がるには貧弱なルートです。あなたは本当に本当に本当に良い理由がない限り、一度に両方を作成する必要があります。私は私の答えを参照してください。 – nitecoder
'object.association.build'は、関連付けの集まりです。特異関係は、 'object.build_association'を使うべきです。ここで、associationは関連するモデルの名前です。疑問がある場合は、レールコンソールを起動して、これがどのように動作するかを試してみてください。 @railsninjaが指摘しているように、2つのフォームを完成させるユーザーエクスペリエンスについて考える必要があります。それほどではありませんが、ネストされた関連付けに対しては完全に有効なソリューションです。 –