6

model を使用して Devise gem (3.1.0) を実行している Rails (4.0) がありますUser。私はコントローラーに名前を付けており、このコントローラーCollectionsControllerでDeviseのアクセサーメソッドを使用して、現在ログインしているユーザーオブジェクトを取得したいと考えています。current_user

その後、それは戻りますundefined local variable or method 'current_user' for CollectionsController:Class。最も興味深いのは、たとえば、別のコントローラーで同じことをしようとすると、PagesControllerすべてが完全に機能することです!
UPD:コントローラーの「コード」を共有します:)

class CollectionsController < ActionController::Base
    def index
         @user = current_user
    end
end

メソッドのソースはcurrent_user、私ではなく、Devise によって定義されます。だから、それは問題ではないと思います。

4

5 に答える 5

18

current_userは、Devise が に提供する便利なメソッドですApplicationController。コントローラーはそれを継承する必要があります:

class CollectionsController < ApplicationController

ActiveRecord::Base(モデルによってサブクラス化された)とActionController(コントローラーによってサブクラス化された)を混同しているようです。Railsのドキュメントによると:

デフォルトでは、Rails アプリケーションの ApplicationController のみが ActionController::Base から継承されます。他のすべてのコントローラーは、ApplicationController から継承します。

于 2013-10-02T22:32:54.953 に答える
4

コントローラーに追加before_action :authenticate_user! します。

参照: https://github.com/plataformatec/devise#controller-filters-and-helpers

于 2015-01-12T06:17:24.033 に答える
0

current_userクラスメソッドではなく、インスタンスメソッドです。

インスタンスではなくクラス内で呼び出していることを意味する CollectionsController:Class言及に注意してください。Classcurrent_user


class CollectionsController < ApplicationController

  current_user # wrong place. Here, current_user is on the Class.

  def index
    current_user # right place. Here, current_user is on the instance.
  end
end
于 2022-01-11T14:55:45.153 に答える