【问题标题】:Extending Devise's SessionsController扩展 Devise 的 SessionsController
【发布时间】:2011-06-20 21:21:21
【问题描述】:

我正在尝试向 Devise 的 SessionsController 添加一个 before_destroy 过滤器。

这是我尝试过的:

我创建了一个包含 before_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,这是我在应用程序中尝试的代码。

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 控制器添加一些小代码。所以我仍然需要设计来像以前一样发挥作用。

再次感谢。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 devise gem


    【解决方案1】:

    为什么不真正扩展 SessionsController?

    例如

    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 即可。

    【讨论】:

    • 我从来没有真正想过这一点。我还在学习 :) 明天上班时我会试一试。谢谢!
    • 我如何将它移到它自己的 Gem 中?我仍然得到未初始化的常量 Devise::SessionsController (NameError)
    • 我已经完成了你提到的一切,但是它不起作用。我还尝试使用 'devise_for :users, :controllers => { :sessions => 'user_trackers'}' 并执行了我在自定义控制器中所需的操作,但是当我尝试注销时,它正在寻找user_trackers#new,而不是新的原始会话...我想设计使用相同的控制器,只是需要一些额外的代码..
    • 你是如何设置设计的,它在你的 gemfile 中吗?我刚刚测试了我的解决方案,它运行良好。如果你继承 Devise::SessionsController,你可以只覆盖你想要的部分。确实会调用 MySessionController#new,但除非你重新定义它(不需要,你只需要一个 before_filter),否则会调用 Devise::SessionsController#new。
    • Devise 的指南告诉你在路由中使用devise_for,它被定义为here。它还提供了一个影子app 目录,可以由您自己的应用程序目录逐个文件覆盖。
    猜你喜欢
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多