2009-08-19 16 views
3

私は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のように思える

せずにユーザーが見つかりませんでしたが、どの部分が間違っているのか分かりません。あなたの助けを前もってありがとう!

答えて

0

プロファイルはユーザーモデルの一部である必要があります。または、登録したユーザーとしてアカウントと少なくともプロファイルのベースをすべて作成し、別のフォームを記入する必要があります私はかなり迷惑になるだろうと思う。

これは、いずれの方法でも1つのフォームで行うことができるということです。私はcomplex formsのrailscastsを見て、あなたが非常に控えめな財政支出を処理できれば、Mastering Rails Formsの現実的なプログラマーシリーズが総勝者になります。

4

ユーザーが作成されると、クライアントはidなしでProfileControllernewアクションにリダイレクトされます。あなたは明示的にユーザーのidをパラメータに渡す必要があります。 IDだけでなく、オブジェクト全体への参照を渡すのはイディオムです。

# app/controllers/users_controller.rb 

def create 
    # ... 
    redirect_to new_user_profile_path(:user_id => @user) 
    # ... 
end 

私はnew_user_profile_pathなくnew_profile_pathを使用しています注意してください。前者は、routes.rbで定義したネストされたリソースです。ユーザーがいないとプロファイルが存在しないため、map.resources :profilesを削除する必要があります。

+0

ありがとう、テイト。私はあなたの助言に従って、私が自分で解決しようとしていたいくつかの間違いに遭遇しました。私は今再び立ち往生している。ユーザーを作成するときに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

+0

これは下がるには貧弱なルートです。あなたは本当に本当に本当に良い理由がない限り、一度に両方を作成する必要があります。私は私の答えを参照してください。 – nitecoder

+1

'object.association.build'は、関連付けの集まりです。特異関係は、 'object.build_association'を使うべきです。ここで、associationは関連するモデルの名前です。疑問がある場合は、レールコンソールを起動して、これがどのように動作するかを試してみてください。 @railsninjaが指摘しているように、2つのフォームを完成させるユーザーエクスペリエンスについて考える必要があります。それほどではありませんが、ネストされた関連付けに対しては完全に有効なソリューションです。 –

0

user_idが存在しないか、プロファイルデータベースに作成されていないためです。ユーザーを作成するとき

関連する問題