2009-06-18 19 views
4

私は、ユーザーがbelongs_toというプロファイルというモデルを持っています。そのため、データベースが追跡する 'user_id'があります。ローカル管理インターフェイスでは、私は管理者が編集画面のフィールドにユーザー名を入力し、コントローラに保存するためのuser_idすることを解決することを可能にする柔軟性を提供したかったこのモデルのために作られました。質問があるしかしアソシエーションが有効であることを確認する方法

は、どのように私は、ユーザー名が有効なリターンを持っていることに対して、チェックしますか? ActiveRecord :: Validationには、関連の存在を検証するメソッドがないことがわかりました。このような状況にどう対処しますか?

アップデート:私は何をしたいが、私は戻って管理者が編集しているプロファイルへのUSER_IDを救うことができる、フォームにユーザー名フィールドが実際に本物のユーザーであることを検証することです。ここで 'return'は返されたユーザオブジェクトを意味します。

答えて

5

この問題は、仮想属性のための良い候補です。 ユーザー名を解決しようとする代わりに、プロファイルモデルをジョブに割り当てます。フォームで次に

class Profile 

    belongs_to :user 

    # ... 

    def username 
    user.try(:username) 
    end 

    def username=(value) 
    self.user = User.find_by_username(value) 
    end 

end 

<% form_for @profile do |f| %> 

    <%= f.text_field :username %> 

<% end %> 

提出した場合、ユーザー名フィールドの値が自動的に他のすべての本物のActiveRecordの属性で渡されます。 ActiveRecordはusername = setterを検索し、関連付けを解決します。 関連付けがnilを返した場合(指定されたユーザ名のレコードが存在しない場合)、現在のuser_idがnilに設定され、検証は期待どおりに失敗します。

エラーコードをカスタマイズしてより意味のあるものにすることができます。

EDIT:例を追加しました。

validate :ensure_username_exists 

def username=(value) 
    self.user_id = User.find_by_username(value) || 0 
end 

protected 

    def ensure_username_exists 
    if user_id == 0 # nil is allowed 
     errors.add(:user_id, "Username doesn't exists") 
     return false 
    end 
    end 
+0

user_idがオプションの場合はどうですか?ここではプロフィールは誰にも属しません。 – itsnotvalid

+0

これを達成する方法はたくさんあります。ユーザー名が存在しない場合は、nilではなく0を返すように、username =()を変更することができます。この場合、値が== 0であるかどうかを確認し、オブジェクトを無効にすることができます。 検証:ensure_username_exists DEF =(値) self.user_id = User.find_by_username(値)をユーザ名|| 0 最後のuser_id == 0#nilには エラーが許可されている場合 はデフ をensure_username_exists保護 。add(:user_id、 "Username does not exist") falseを返す end end これはほんの一例です。 –

+0

申し訳ありません。私は例を書いたが、コメントにはコードを入れることはできないようだ。 :S –

1

これは、Active Recordのアソシエーションの便利なリファレンスです:http://guides.rubyonrails.org/association_basics.html

だけ関連 .nilをチェックし、組合の存在を確認するには?

if @profile.user.nil? 
    ... something ... 
end 

ユーザー名が有効な返品を行っているかどうかを確認するには、どういう意味か分かりません。それを拡大できますか?

+0

更新されました。ありがとう。 – itsnotvalid

+0

nil?の値をチェックするのは悪い習慣と考えられます。代わりにを使用してください。だから上のあなたの例があります:なし@ profile.user; ..何か; end – karlingen

関連する問題