2010-12-11 12 views
1

非常にシンプルなソーシャルネットワークを作りたかったのです。私は2つのモデルから始めました:ユーザー(Devise gemを使って)と彼のプロフィール。彼らは、1対1の関係で接続されているので、私のルートは次のようになります。Rails 3の単一リソースモデルにバリデーションを追加できません

resources :users do 
    resource :profile 
end 

私は適切なコントローラを持っている - ここでは、プロファイルを作成するためのコード(編集はほとんど同じである)です。

def new 
    @profile = current_user.create_profile 
end 

def create 
    @profile = current_user.profile.create(params[:profile]) 
    if @profile.save 
     redirect_to user_profile_path(current_user) 
    else 
     render :action => "new" 
    end 
end 
は、

私はcurrent_user変数を使用しました。なぜなら、ユーザーはアドレスバーに何を入力していても、他のユーザーのプロフィールを作成することができないからです。ユーザーがプロファイルにデータを追加することができますし、「保存」打った後、その新たに作成されたにリダイレクトされている - 私が期待と同じように働いている

- form_for [@profile.user, @profile] do |p| 
    (fields omitted) 

:私はフォームを持っている「新しい」ビューで

ページ。しかし、私はProfileモデル( validates_presence_of のようにもシンプルなもの)にいくつかの検証を追加して、新しいプロファイルを作成しようとすると、私のコントローラがエラーを私に示しています

undefined method `user_profiles_path' for #<#<Class:0xb2d3e5c>:0xb2d2728> 

Extracted source (around line #1): 
1: - form_for [@profile.user, @profile] do |p| 

それは奇妙だが、この問題にはありません新しいプロファイルを作成しようとしている間のみ、プロファイル情報の更新時に発生します。私は、form_forヘルパーでリダイレクトURLを指定するように指示する解決策を探った。だから私は私の見解でそれを変更しました:

- form_for [@profile.user, @profile], :url => user_profile_path(@profile.user) do |p| 

まだ動作しません。それは私が望んでいたビューが表示されます(最初から検証エラーメッセージでは、私は;-)それと住むことができる)が、「保存」打った後、それは別の問題を生成します。

undefined method `create' for nil:NilClass 

私もそれを見つけますより詳細には、エラーの詳細にパラメータオブジェクトを表示するので、適切なデータが含まれていますが、すべてがnilではありません。私はアイデアがなくなり、間違っている可能性があります。

私はちょっと不思議です。何が私の問題の原因となり、それを修正するのですか?

ありがとうございます!

+0

当時1つの質問をしないようにしてください –

答えて

0

てみ

あなたのアクションを作成するには
@profile = current_user.create_profile(params[:profile]) 

- 代わり.profile.createの

+0

「未定義のメソッドはありません」とは依然として「create_profile」を見つけることができません。 – Elrosa

+0

その場合は、current_userがnilであるように聞こえます! – Cory

0

私は、次のことをお勧め:

# user.rb 
    def initialize(*params) 
    super(*params) 
    self.build_profile unless self.profile 
    end 
0

まず: CURRENT_USERがあることを確認し、必要ユーザはログインする必要があります。

2番目: プロファイルが永続化されていないため、newに対してuser_profiles_pathメソッドが取得されています。その場合、レールのURL生成方法は複数形になります。正しいURLを常に使用したい場合は、[@profile.user, :profile]を使用してください。これは、ユーザーごとにプロファイルが1つしかないため、プロファイルIDが不要です。

第三:あなたのアクションを作成するには 、

@profile = current_user.profile.create(params[:profile]) 
# with 
@profile = current_user.build_profile(params[:profile]) 

最終を置き換える: プロファイルの作成と編集の違いを持っ​​ていないことを検討してください。あなたのエンドユーザにとっては、何の違いもありません。空のプロファイルがない場合に備えて、前のフィルタに空のプロファイルの作成を追加することができます。それはあなたのためのコードも少なくなります。維持する

関連する問題