【问题标题】:Rails3 Devise custom routing for confirmable moduleRails3 为可确认模块设计自定义路由
【发布时间】:2011-08-12 01:45:52
【问题描述】:

在用户通过设计的可确认项确认其帐户后,我正尝试将用户引导至自定义欢迎页面。自定义页面位于 /districts/setup/,可通过 districts_setup_path 访问。

为此,我添加了自定义路线,

devise_for :users, :controllers => { :registrations => 'registrations', :confirmations => 'confirmations' }

并创建了我自己的控制器。然后我不得不重载confirms_controller.rb,现在有了:

(app/controllers/confirmations_controller.rb)

类 ConfirmationsController |设计::确认控制器 # GET /resource/confirmation?confirmation_token=abcdef 定义显示 self.resource = resource_class.confirm_by_token(params[:confirmation_token]) 如果resource.errors.empty? set_flash_message(:notice, :confirmed) if is_navigational_format? 登录(资源名称,资源) 重定向到区设置路径 别的 render_with_scope :新 # 不是: # respond_with_navigational(resource.errors, :status => :unprocessable_entity){ 结尾 结尾 结尾

这很好用,但我很紧张,因为我没有以最理想和最稳健的方式来做这件事。特别是,我刚刚删除了我真的不明白的 respond_with_navigational( ... ) 行。

我希望将这一切都写在 Devise wiki 的操作指南中,我只是在寻找对 Rails 相当新的反馈,甚至对 Devise/engines/warden 来说更新。

【问题讨论】:

  • 我一直在测试它,它似乎工作正常。
  • 不应该有办法只编写一个提供正确路径的辅助方法吗?我也在努力解决这个问题。

标签: ruby-on-rails-3 devise


【解决方案1】:

查看 Devise 的 ConfirmationsController,您可以发现受保护的方法 after_confirmation_path_for(resource_name, resource)。覆盖它(而不是整个操作)会以更少的努力产生相同的结果。

一般来说,重写 Devise 的控制器没有问题,因为它们代表了并不总是适合应用程序需求的默认行为。话虽如此,在覆盖 Devise 的代码之前,您必须采取一些措施:

  1. Devise 不仅仅是系统的另一个组件 - 它处理用户身份验证,这是一个非常敏感的问题。确保在提交之前没有破坏任何重要的内容。为此,您可以从 github 分叉 Devise 项目,进行更改并运行测试。
  2. 当您更改设计和覆盖其代码时,升级到新版本将变得更加困难,这可能与您的更改不兼容。
  3. 如果您决定进行更改,请寻找可能实现目标的最小更改。在大多数情况下,Devise 的团队已经预见到在某些地方需要定制,并留下专门用于定制的方法(如上面的那个)。同样,在 Devise 的 GitHub 上查看文件的代码会给你一个好主意,什么是根据你的需要自定义其行为的最佳方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    相关资源
    最近更新 更多