2012-03-14 9 views
15

私のアプリでは、さまざまなものを検証するさまざまなサインインエントリーポイントがあります。データベースフィールドではない一時変数を設定する方法を教えてください。

メインサインアップでは、電子メールとパスワードのフィールドを除いて、何も必要ありません。代替のサインアップフィールドでは、さらに多くのことが必要です。だから私は

validate_presence_of :blah, :lah, :foo, :bah, :if => :flag_detected 

def flag_detected 
    !self.flag.nil? 
end 

を持っているユーザーモデルでは、私はコントローラを介してそのフラグを設定したいです。ただし、そのフラグはデータベースフィールドではありません。私はこれがRailsで達成可能か、それとも私がこれについて考えている方法に何か間違っているのか疑問に思っていますか?もしそうなら、これを達成する最良の方法は何ですか?ありがとう。

+0

"インスタンス変数"(アクセサーを介して公開されている - たとえば、必要ならば 'attr')の代わりに、このメソッドを呼び出してください。それは、モデルが*持続*モデルの一部ではないため、モデルでそうすることが「良い習慣」であれば議論の対象となります。しかし、コントローラでは、なぜですか? –

+0

私は、コントローラから呼び出されたそのセーブのための一時変数である必要があります。コントローラーで@ user.flag = trueを設定すると、モデルで実際には表示されません。 – gtr32x

+0

だから私はそれにattr_accessorを定義する必要がありますか?私はすでにattr_protectedを持っていれば、そのあと何とかそこにいますか? – gtr32x

答えて

28

を定義する必要があるように思えるあなたのモデルのuser.flaguser.flag = ...メソッドを作成attr_accessor

class User < ActiveRecord::Base 
    attr_accessor :flag 
    attr_accessible :flag # if you have used attr_accessible or attr_protected else where and you are going to set this field during mass-assignment. If you are going to do user.flag = true in your controller's action, then no need this line 
end 

基本的にattr_accessor :flagです。

およびattr_accessibleは、質量割り当て保護用です。

+0

Cool、attr_accessorはうまくいきました!ありがとう! – gtr32x

+0

Doh! Rails 4用ではありませんhttp://easyactiverecord.com/blog/2014/04/01/rails-4strong-parameters-and-the-attr-accessible-macro/ – olyv

+0

クラス変数@flagを使用するのが最も簡単です本件 .. – JChow

1

あなたはあなたが必要なものsetterメソッド

class User < ActiveRecord::Base 
    attr_accessible :flag 

    def flag=(boolean) 
    boolean 
    end 
end 
+0

attr_accessibleと一緒に試してみましたが、まだ動作していません。 – gtr32x

3

ベストプラクティスの議論にフォローアップ:

何をしたいんメソッドを作成します。私。 save_with_additional_validation。これははるかに明確で自己文書化するコードであり、同じように動作します。

関連する問題