0

Devise と Omniauth を使用しています。current_userしたがって、コントローラーでメソッドを使用できるはずです。実際、たとえば、 my でtasks_controller:

  def index
    @tasks_remaining = Task.where(:user => current_user, :done => false)
    @tasks_done = Task.where(:user => current_user, :done => true)
  end

current_user期待どおりに動作します。current_user非常に奇妙なことに、RubyMineは見つからないことを警告し、灰色の下線を引きます。しかし、このコードはとにかく機能します。

しかし、私の中authentications_controllerで、

def create
    omniauth = request.env["omniauth.auth"]
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
    if authentication
      sign_in_and_redirect(:user, authentication.user)
    else
      current_user.authentications.create(:provider => ominauth['provider'], :uid => omniauth['uid'])
      flash[:notice] = "success"
      redirect_to authentication_url
    end
  end

current_userここで、その行を実行するとエラーが発生します。それは言います:

undefined method `authentications' for nil:NilClass

この時点までデバッグしたところ、current_user変数が実際にこのスコープに存在しないことがわかりました。

では、なぜあるコントローラーでは機能し、別のコントローラーでは機能しないのでしょうか? Rails 4 と Ruby 2 を使用しています。Railscast 235 と 236 に従っています。

4

1 に答える 1

2

このエラーは current_user メソッドが見つからないという意味ではなく、誰もサインインしていないために nil を返すという意味ではありません。

def create
  omniauth = request.env["omniauth.auth"]
  authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])
  if authentication
    flash[:notice] = "Signed in successfully."
    sign_in_and_redirect(:user, authentication.user)
  elsif current_user
    current_user.authentications.create!(:provider => omniauth['provider'], :uid => omniauth['uid'])
    flash[:notice] = "Authentication successful."
    redirect_to authentications_url
  else
    user = User.new
    user.apply_omniauth(omniauth)
    if user.save
      flash[:notice] = "Signed in successfully."
      sign_in_and_redirect(:user, user)
    else
      session[:omniauth] = omniauth.except('extra')
      redirect_to new_user_registration_url
    end
  end
end

認証コントローラーのコードに「elsif current_user」のような条件を書きましたか?

Railscasts omniauth #1 からこのコードをコピーしたことがわかるので、railscasts omniauth #2 も見ることをお勧めします。

于 2013-07-28T18:11:15.820 に答える