Rails为可确认模块设计自定义路由

时间:2011-04-25 01:05:33

标签: ruby-on-rails-3 devise

我正在尝试通过设计确认来确认帐户后,将用户转到自定义欢迎页面。自定义页面位于/ zone / setup /,可通过districts_setup_path访问。

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

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

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

(应用程序/控制器/ confirmations_controller.rb)

class ConfirmationsController | Devise::ConfirmationsController

  # GET /resource/confirmation?confirmation_token=abcdef
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_navigational_format?
      sign_in(resource_name, resource)
      redirect_to districts_setup_path
    else
      render_with_scope :new
      # not:
      # respond_with_navigational(resource.errors, :status => :unprocessable_entity){
    end
  end
end

这种方法效果很好,但我很紧张,我并没有以这种方式做到这一点。特别是,我刚刚删除了response_with_navigational(...)行,我真的不明白。

我希望在Devise wiki的操作方法中写下这一切,我只是在寻找对rails来说相当新的反馈,甚至更新的Devise / engine / warden。

1 个答案:

答案 0 :(得分:1)

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

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

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