3

私は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
マイ ユーザー モデル リスト: has _one :profile

私の routes.rb ファイルには次のものがリストされています:
map.resources :users, :has_one => :profile
map.resources :profiles

プロファイル テーブルに user_id 外部キーがあります。私のスキーマは次のようになります。

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

プロファイルをユーザーに接続するために、profiles_controller.rb ファイルを次のように更新しました。これは、基本的に Rails Getting Started Guide から推定したものです。私の考えでは、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 in ProfilesController#new
ID のないユーザーが見つかりませんでした

これはすべて非常に単純な Rails の使用例のように思えますが、どの部分が間違っているのかわかりません。よろしくお願いします。

4

3 に答える 3

4

ユーザーが作成されると、クライアントは のnewアクションにProfileControllerリダイレクトされますid。ユーザーのパラメーターを明示的に渡す必要があり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.rbmap.resources :profilesプロファイルはユーザーなしでは存在できないため、削除する必要があります。

于 2009-08-19T11:14:05.853 に答える
0

使いやすさのために、プロファイルはユーザーモデルの一部である必要があります。または、アカウントを作成し、少なくともプロファイルのベースを一度に作成する必要があります。登録したユーザーとして、別のフォームに記入する必要がありました。かなりイライラする。

これの利点は、どちらの方法でも 1 つのフォームでこれを行うことができることです。私は複雑なフォームの Railscast を見てみたいと思います。非常に控えめな経済的支出を処理できる場合は、 Rails フォームのマスターに関する実用的なプログラマー シリーズが完全に勝者です。

于 2009-08-19T11:04:37.120 に答える
0

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

于 2009-12-16T07:15:24.710 に答える