Расширение Devise's SessionsController - PullRequest
3 голосов
/ 21 июня 2011

Я пытаюсь добавить фильтр before_destroy в Devise's SessionsController.

Вот что я пытался:

Я создал модуль, содержащий фильтр before_destroy, и другой модуль с методом, который я хотел вызвать.

module UserTracker

  prepend_before_filter :stop_tracking, :only => [:destroy]

  module TrackerStopper
    def stop_tracking
      # Do stuff
    end
  end

  include TrackerStopper
end

А потом я попытался расширить SessionsController с помощью модуля UserTracker.

Devise::SessionsController.extend UserTracker

Это не сработало, потому что devise не загружалось, когда загружался мой модуль. Это привело к ошибке ниже:

uninitialized constant Devise::SessionsController (NameError)

По сути, я хотел бы запускать метод каждый раз, когда сеанс уничтожается, без перезаписи всего SessionsController, но я не могу найти способ смешать его.

Спасибо!

ОБНОВЛЕНИЕ 1: Я отказался от создания отдельного гема, вот код, который я попытался в моем приложении.

UserTrackersController.rb

class  UserTrackersController < Devise::SessionsController
  prepend_before_filter :stop_tracking, :only => [:destroy]

  def stop_tracking
    current_user.update_attributes(:current_sign_in_ip => nil)
  end
end

routes.rb

#--
# Devise
devise_for :users, :controllers => { :sessions => 'user_trackers'}

Проблема в том, что если я пытаюсь войти (или выйти в этом случае), я получаю следующую ошибку:

Template is missing

Missing template user_trackers/new with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:en, :en]} in view paths "/net/user10/ardavis2/rubydev/spacecamp/app/views", "/net/user10/ardavis2/.rvm/gems/ruby-1.9.2-p180@spacecamp/gems/devise-1.3.4/app/views"

Я не хочу, чтобы мой новый UserTrackersController делал что-либо, кроме добавления небольшого кода в существующий контроллер Sessions. Поэтому мне все еще нужно разработать устройство, чтобы оно функционировало так, как раньше.

Еще раз спасибо.

1 Ответ

13 голосов
/ 21 июня 2011

Почему бы вам не расширить SessionsController?

* 1003 Е.Г. *

class MySessionsController < Devise::SessionsController
  # my changes
end

И в конфигурации маршрутизации вы можете указать devise_for, какой SessionsController использовать:

devise_for :controllers => { :sessions => "my_sessions" } 

Редактировать: вы можете создавать виды разработок, вызывая:

rails g devise:views <scope>

Это сгенерирует app/views/devise/sessions/new.html.erb, который является единственным представлением, необходимым для работы. Просто скопируйте его в app/views/my_sessions/new.html.erb, и он будет работать.

...