Devise 2 Support with Rails 3 Mountable Engine

节前升级devise到2.0.0.rc,出现了一些小问题,一直到今天才有空解决,发现devise 2.0直接对Rails 3中的mountable engine进行支持了。

升级到 2.0 后,发现所有的devise url_helper所生成的router都不能用,像session_path… 但可以通过标准link来访问,但很是不便。将版本降到1.5.3后就能正常工作。研究了下2.0的变化,发现太多,就直接给作者开了个新的issue:http://t.cn/zOzKA9b,很快便得到了答复。

关于Devise 2.0的升级通知中有对mountable engine support的说明:
http://blog.plataformatec.com.br/2012/01/devise-2-0-released/

同时作者也有一篇文章来介绍如何在Mountable Engine中使用Devise 2.0,但很不祥细。

How to use Devise Inside a Mountable Engine

这里也记录下这次升级的内容和方式

  1. 首先在使用Devise的Engine中将gem version 升级为 ~> 2.0.0

  2. 在Mountable Engine中 config > initializers 下创建 devise.rb的配置文件,已有的,直接替换以下内容,内容见:

1
2
3
Devise.setup do |config|
config.router_name = :phoenix
end

router_name 值为engine的 isolate_namespace值

  1. 配置Engine内的routes
1
2
3
4
5
6
7
8
9
10
11
Phoenix::Core::Engine.routes.draw do
devise_for :users, {
class_name: ‘Phoenix::User’,
module: :devise,
controllers: {
:registrations => “phoenix/registrations”,
:confirmations => “phoenix/confirmations”,
:passwords => “phoenix/passwords”,
:sessions => “phoenix/sessions” }
}
end
  1. 最后在host 项目的config > initializers 下加入标准的devise.rb config文件,放在host下,可以根据用户的需求而更发。当然也可直接将下面地址的内容复制使用。

http://raw.github.com/plataformatec/devise/master/lib/generators/templates/devise.rb

将mailer_sender…等参数替换为网站的真实值。

不难发现,这种方式相对于1.x很好的解决了mountable的问题,多个子engine也都可以拥有自己的auth系统,和各自定制化的配置信息。

使用起来也相当的容易。