我正在尝试添加一个before_destroy过滤器来设计会话控制器。
以下是我的尝试:
我创建了一个包含before\u destroy过滤器的模块,并使用我希望它调用的方法创建了另一个模块。

module UserTracker

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

  module TrackerStopper
    def stop_tracking
      # Do stuff
    end
  end

  include TrackerStopper
end

然后我尝试用usertracker模块扩展sessionscontroller。
Devise::SessionsController.extend UserTracker

这不起作用,因为我的模块加载时未加载设备。这导致以下错误:
uninitialized constant Devise::SessionsController (NameError)

基本上,我希望每次会话被破坏时都运行一个方法,而不覆盖整个sessionscontroller,但是我想不出一种方法来混合它。
谢谢!
更新1:我放弃了构建单独的gem,这是我在应用程序中尝试的代码。
用户跟踪控制器.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

惯例
#--
# 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做任何事情,除了向现有会话控制器添加一些小代码。所以我仍然需要设计出像以前一样的功能。
再次感谢。

最佳答案

为什么不扩展sessioncontroller?
例如。

class MySessionsController < Devise::SessionsController
  # my changes
end

在路由配置中,您可以告诉设计人员要为哪个会话控制器使用:
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就行了。

10-04 19:19