2

Rails 3.2.5、デバイス 2.1

Devise を使用してユーザーを認証していますが、新しいユーザーを作成するときに問題が発生しています。

before_saveユーザーは、User モデルのフィルターを使用して作成したアカウントに属しています。これは正常に機能し、しばらくの間機能します。

新しいコードでは、create メソッドの一部としてユーザーのアカウント情報が必要です。リクエストで渡されたパラメーターに依存しているため、これはモデル ロジックの良い候補ではありません。Devise::RegistrationsController#create メソッドをオーバーライドしました。

class DeviseCustom::RegistrationsController < Devise::RegistrationsController
  def create
    super                                  # Call Devise's create
    account = current_user.account         # FAIL! (current_user is nil)
    account.partner_id = current_partner
    account.save!
  end
end

current_userコードがnil失敗する原因です。障害が発生した場合でも、ユーザーとアカウントのレコードがデータベースに保存commitされていることがわかります。ログにself.inspectは .

このコンテキストで利用できると思っていたcurrent_userでしょう-作成したばかりのユーザーに到達するための適切な方法は何ですか?

ありがとう

4

2 に答える 2

4

オーバーライド時にコントローラーに組み込むことで、Devise ヘルパー メソッドを使用することができました。

include Devise::Controllers::Helpers

于 2013-06-16T06:28:06.293 に答える
1

序文: 私はデバイスを使用したことがありません。

私の推測では、 current_user オブジェクトが作成されていないのは、呼び出しチェーンの早い段階で (ユーザー資格情報がない) 理由がなかったか、おそらく #after_save でまだ発生していないためです (存在する場合は? )。

Devise は #resource メソッドを使用して、保存しようとしている現在のインスタンス変数を取得します (またはそのように見えます):

https://github.com/plataformatec/devise/blob/master/app/controllers/devise_controller.rb#L16

私がすることは、それを次のように変更することです:

class DeviseCustom::RegistrationsController < Devise::RegistrationsController
    def create
      super                                  # Call Devise's create
      account = resource.account         # FAIL! (current_user is nil)
      account.partner_id = resource.current_partner
      account.save!
    end
end

おそらくこれをモデルに追加したいと思うでしょう:

attr_accessor :current_partner

これにより、リソース (モデル) から current_partner にアクセスできるようになります。

うまくいけば、それは役に立ちます!

于 2012-07-07T00:07:10.560 に答える