Проблемы с обратными вызовами Warden :: Manager after_authentication - PullRequest
2 голосов
/ 13 января 2012

Это было бы проще для меня, если бы Ruby был моим первым языком, но в любом случае вот мой вопрос:

Используя Rails 3.1, я пытаюсь получить доступ к некоторым обратным вызовам Warden Manager с помощью Devise для созданияновая «корзина» каждый раз, когда пользователь входит в систему. Я помещаю эту логику в свой ApplicationController.Проблема в том, что когда я создаю корзину, я хочу дать ей идентификатор пользователя.Я пытался использовать вспомогательный метод Devise current_user, но он не работает.

Самое главное, я хочу знать, почему я не могу получить доступ к своим вспомогательным методам или методам, определенным в ApplicationController, извнутри блока Warden :: Manager.Но я также хочу знать, как я могу отредактировать свой код, чтобы я мог использовать метод Devise current_user (и мой метод current_cart, показанный ниже) в блоке без ошибок, как при вызове перечисленного ниже.Вот мой код:

class ApplicationController < ActionController::Base
  helper :all
  helper_method :current_user
  protect_from_forgery

  before_filter :fetch_categories

  .
  .
  .

  def current_cart
    @current_cart ||= Cart.find_by_user_id(current_user.id)
  end

  Warden::Manager.after_authentication do |user, auth, opts|
    Cart.create!(:user_id => current_user.id)
  end
end

Вот ошибка:

NameError in Devise::SessionsController#create

undefined local variable or method `current_user' for ApplicationController:Class

Ответы [ 2 ]

5 голосов
/ 08 февраля 2012
Warden::Manager.after_authentication do |user, auth, opts|
  Cart.create!(:user_id => user.id)
end

В блоке after_authentication у вас нет доступа к current_user. Вместо этого используйте недавно аутентифицированный пользовательский объект, переданный в качестве параметра.

0 голосов
/ 13 января 2012

Что ж, мне не очень нравится отвечать на мои собственные вопросы, но, поскольку я чувствую себя обязанным не оставлять без ответа ни одного вопроса:

То, что я в итоге сделал, по сути было обходом всего процесса обратного вызова в целом.Хотя это может быть своеобразным в моей ситуации, вот что я сделал:

В контроллере приложения:

before_filter :authenticate_user!, :only => :current_cart

Таким образом, пользователь должен войти в систему для вызова current_cart.А также измените current_cart на:

def current_cart
  session[:cart_id] ||= Cart.create(:user_id => current_user.id).id
  @current_cart ||= Cart.find(session[:cart_id])
end

Таким образом, current_cart создает новую корзину, если она еще не существует.Вы также можете выполнять функцию before_filter в других контроллерах, которые могут повлиять на вашу корзину, таких как LineItems или Products.

...