2012-04-12 19 views
12

ユーザーの作成時にフィールドを設定する必要があります。私はデビス登録のオーバーライドを作成する

私はタグのパラメータを渡すチェックボックスを持って、私はタグのパラメータが渡されているサーバーのログで確認している。しかし、コンソールで@ user.tag_listを呼び出すと、空白の応答[]が表示されます。

私は、問題が作成者の作成方法の操作にあると感じています。私は明示的に@userをどこにでも設定していませんが、Deviseを使って設定する方法がわかりません。誰でも特定のフィールドを設定する方法を知っていますか?代わりに工夫を呼び出すためにsuperを使用しての

+2

Planetpluto、あなたはあなたのコメントPuneethでお伝えしたように、 'resource'を使用するためのあなた自身の答えを追加し、答えとしてマークする必要があります。それははるかに優れた、より簡単な解決策です。 – Jeff

答えて

39

と交換し、アクションを作成このようなものが同様に動作するはずですので、方法は、ブロックを受け入れる工夫:

class RegistrationsController < Devise::RegistrationsController 
    def create 
    super do 
     resource.tag_list = params[:tags] 
     resource.save 
    end 
    end 
end 
+0

それは私のために働かなかった(Rails 3.2)、私は古い1つのスーパーして私の指示に切り替えました – OWZY

+0

Worked on Rails 5.1。 –

10

:: RegistrationsControllerのほとんどの、この中には工夫メソッドをオーバーライドする方法を探して見つけた人のための今後の参考のためにactual code of Devise::RegistrationsController's create method

build_resource 
resource.tag_list = params[:tags] #******** here resource is user 
if resource.save 
    if resource.active_for_authentication? 
    set_flash_message :notice, :signed_up if is_navigational_format? 
    sign_in(resource_name, resource) 
    respond_with resource, :location => after_sign_up_path_for(resource) 
    else 
    set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format? 
    expire_session_data_after_sign_in! 
    respond_with resource, :location => after_inactive_sign_up_path_for(resource) 
    end 
else 
    clean_up_passwords resource 
    respond_with resource 
end 
+1

ありがとう、これは完全に動作します。 @ user.tag_list resource.tag_listの代わりにsuperを使って試してみるつもりです。 – Vasseurth

+0

このような古いスレッドを再訪して申し訳ありませんが、Puneethさんは、 'super'を使用するのとは対照的に、Deviseのcreateメソッドから実際のコードを入れた方がいい理由を説明できますか? – jeffdill2

+0

@streetlogics答えがこの問題に対処しています。 devis create superはこの行に "block_givenならリソースを得ますか?"彼の例で追加されたブロックを評価します。 – blnc

6

を作成したメソッドのコード全体を書き換えしたくない場合は、単にprote内部のリソース変数を設定することができますメソッド:build_resourceDevise :: RegistrationsControllerこれは、リソースが保存される前に呼び出されます。

protected 

# Called before resource.save 
def build_resource(hash=nil) 
    super(hash) 
    resource.tag_list = params[:tags] 
end 
+0

これは、Rails 4 w/Devise 3.5で私のために働いていました。ありがとうございました!!!!!! – cman77

+1

私のバリデーションを2回トリガする受諾された回答に問題があったので、このアプローチは私の実装に新しいアプローチをもたらしました。 – ollaollu

関連する問題