`

devise 定制视图 (二)

 
阅读更多

 

来自:http://hlee.iteye.com/blog/673386

 

 

在上一篇的介绍Devise【视频,阅读】中,我们已经可以在我们的Rails应用中搭建和使用devise的基本功能了。现在,我们从上一篇介绍留下来的问题开始,来阐述如何定制devise。 
在上一篇的介绍里,我们已经可以在rails项目里通过devise很容易的添加注册,登录和退出的功能: 



访问限制 

接下来,我们将实现限制访问。在我们这个应用中(译者注:我们开发的是一个简单的项目管理系统),就是对于创建,修改和删除项目进行权限控制,只有注册并且登录的用户才能有权操作。 
我们通过在中ProjectsController添加一个before_filter,在其中调用devise提供的检查是否授权的方法authenticate_user!。这个方法会检查Project下的所有方法,如果,用户没有登录并且试图调用该方法的时候,就会跳转到登录页面。理论上讲,没有登录的用户也应该可以访问index和show方法,也就是说,我们还应该添加一个:except选项来保证用户可以正常方法上面两个方法: 

 

Ruby代码   收藏代码
  1. class ProjectsController < ApplicationController    
  2.       
  3.   before_filter :authenticate_user!, :except => [:show:index]    
  4.     
  5.   def index    
  6.     #rest of class   



那么现在,我们点击“New Project”链接,因为我们还没有登录,上面的访问限制就会其作用,页面会跳转到登录页面: 



如果,我们仅仅是用来实现简单的是否登录的检查,那devise已经可以很好很简单的处理了。然而,如果我们的授权和访问控制很复杂(译者注:多角色,多用户,交叉权限等),这时我们需要额外的授权控制的插件来实现,比如我们在第192【视频,阅读】中介绍的CanCan一起使用,解决实际的业务需求。 

定制Devise的页面显示 

我们上209集就遗留一个问题,就是devise会自动为我们生成权限维护过程中的view,那么当我们需要页面的风格和我们的风格一致的时候,就需要自己来定制显示了。Devise也考虑到了这一点,提供了如下途径来解决这个问题。因为devise本身是基于Rails引擎的,只要覆盖原来的页面(实际是override原来的方法)就可以实现定制的要求了。同时devise提供了一个方便的generate方法用来生成这些用来重载的页面方法,如下: 

Ruby代码   收藏代码
  1. $ rails generate devise_views  
  2.       create  app/views/devise  
  3.       create  app/views/devise/confirmations/new.html.erb  
  4.       create  app/views/devise/mailer/confirmation_instructions.html.erb  
  5.       create  app/views/devise/mailer/reset_password_instructions.html.erb  
  6.       create  app/views/devise/mailer/unlock_instructions.html.erb  
  7.       create  app/views/devise/passwords/edit.html.erb  
  8.       create  app/views/devise/passwords/new.html.erb  
  9.       create  app/views/devise/registrations/edit.html.erb  
  10.       create  app/views/devise/registrations/new.html.erb  
  11.       create  app/views/devise/sessions/new.html.erb  
  12.       create  app/views/devise/shared/_links.erb  
  13.       create  app/views/devise/unlocks/new.html.erb  



这个命令复制了所有devise中的页面,那么,也就是说我们只要编辑修改对应的页面和我们原来的项目风格一致。如下,是我们登录页面的代码: 

Ruby代码   收藏代码
  1. #/app/views/devise/sessions/new.html.erb  
  2. <h2>Sign in</h2>    
  3.     
  4. <%= form_for(resource_name, resource, :url => session_path(resource_name)) do |f| %>    
  5.   <p><%= f.label :email %></p>    
  6.   <p><%= f.text_field :email %></p>    
  7.     
  8.   <p><%= f.label :password %></p>    
  9.   <p><%= f.password_field :password %></p>    
  10.     
  11.       <% if devise_mapping.rememberable? -%>    
  12.         <p><%= f.check_box :remember_me %> <%= f.label :remember_me %></p>    
  13.       <% end -%>    
  14.         
  15.       <p><%= f.submit "Sign in" %></p>    
  16.     <% end %>    
  17.         
  18.     <%= render :partial => "devise/shared/links" %>    



我们会修改如下: 

Ruby代码   收藏代码
  1. #/app/views/devise/sessions/new.html.erb  
  2. <% title "Sign In" %>    
  3.     
  4. <%= form_for(resource_name, resource, :url => session_path(resource_name)) do |f| %>    
  5.   <ol class="formList">    
  6.     <li><%= f.label :email %> <%= f.text_field :email %></li>    
  7.     <li><%= f.label :password %> <%= f.password_field :password %></li>    
  8.     <% if devise_mapping.rememberable? -%>    
  9.     <li><%= f.check_box :remember_me %> <%= f.label :remember_me %></li>    
  10.     <% end %>    
  11.         <li><%= f.submit "Sign in" %></li>    
  12.       </ol>    
  13.     <% end %>    
  14.     <%= render :partial => "devise/shared/links" %>   



我们可以从上面的代码看到用在定制自己页面的时候,我们title的方法替换了header,这种修改页面的方法,我们在第30集【观看,阅读】也可以通过如下git gem来查询相关nifty generators。我们也可以看到我们还修改了,页面的布局用ol标签,加上一个formlist类,这样我们的css就其作用,原来简单的devise的界面,就能够变成我们需要的界面了。 






定制错误提示信息 

Devise处理错误信息的方式是把所有需要的信息都用i18n的方式保存在config/local目录下,这样就很容易修改和翻译。比如,当输入了错误的email和password的时候,会提示“invalid email or password”如果想要修改这个错误提示,只需要修改对应文件下的devise.failure.invalid错误提示: 

Ruby代码   收藏代码
  1. #/config/locales/devise.en.yml  
  2. en:    
  3.   errors:    
  4.     messages:    
  5.       not_found: "not found"    
  6.       already_confirmed: "was already confirmed"    
  7.       not_locked: "was not locked"    
  8.     
  9.   devise:    
  10.     failure:    
  11.           unauthenticated: 'You need to sign in or sign up before continuing.'    
  12.           unconfirmed: 'You have to confirm your account before continuing.'    
  13.           locked: 'Your account is locked.'    
  14.           invalid: 'OH NOES! ERROR IN TEH EMAIL!'    
  15.           invalid_token: 'Invalid authentication token.'    
  16.           timeout: 'Your session expired, please sign in again to continue.'    
  17.           inactive: 'Your account was not activated yet.'    
  18.         sessions:    
  19.           signed_in: 'Signed in successfully.'    
  20.           signed_out: 'Signed out successfully.'    
  21.     #rest of file omitted.  


这时,当我们再登录并且输入错误的email地址时我们就会看到我们修改的错误提示了: 



上面的是错误提示信息,那么,如果我们希望修改validation的验证错误提示呢,比如,在注册过程中不符合要求的字段提示信息,如下: 





针对validation Devise有一个配置文件,在/config/initializers/ devise.rb文件中,这个文件保存了很多和devise相关的配置信息。这些配置选项有很好的文档注释,以便容易找到对应的选项并且做出修改。那么,如果我们想要把口令的最小长度从原来的6位减少到4位,那么,只需要去掉对应的注释,并修改对应的配置选项。值得注意的是,修改完配置文件后,需要重启server才能够加载生效。 

Ruby代码   收藏代码
  1. #/config/initalizers/devise.rb  
  2.     # ==> Configuration for :validatable    
  3.     # Range for password length    
  4.     # config.password_length = 6..20    



如果,我们的验证信息更复杂,devise的选项根本没有办法满足,那么我们也可以通过去掉devise的validatable模块,并且自己在User model中添加自己的验证信息的方式来添加自己的独特定制验证信息。 

Ruby代码   收藏代码
  1. #/app/models/user.rb  
  2.     class User < ActiveRecord::Base    
  3.       # Include default devise modules. Others available are:    
  4.       # :token_authenticatable, :lockable, :timeoutable and :activatable    
  5.       # :confirmable,    
  6.       devise :database_authenticatable:registerable,     
  7.              :recoverable:rememberable:trackable:validatable    
  8.         
  9.       # Setup accessible (or protected) attributes for your model    
  10.       attr_accessible :email:password:password_confirmation    
  11.     end    



我们可以看到在User的描述中devise方法有很多参数(译者注:就是devise的11个功能模块是否使用的配置。)其中,:validatable就是用来实现注册过程的字段验证的。如果,我们希望自己定制这些字段检查,那么我们就需要先去掉这个:validatable的描述,然后,在User中添加自己需要的字段验证,虽然,devise允许这样自己定制。然后,大部分的情况devise提供的字段验证已经可以处理 

路由 

定制路由,是说例如devise默认注册页面在/users/sign_up但是比如,我们想要改到/register。实际上默认的devise路由是通过router.rb中的devise_for :users提供的。当然,这些路由devise也提供了修改途径: 

Ruby代码   收藏代码
  1. #/config/routes.rb  
  2.     ProjectManage::Application.routes.draw do |map|    
  3.       devise_for :users    
  4.         
  5.       resources :projects    
  6.       root :to => 'projects#index'    
  7.     end    



比如上面的需求,我们可以通过添加path_names的参数达到,如下: 

Ruby代码   收藏代码
  1. #/config/routes.rb  
  2.     ProjectManage::Application.routes.draw do |map|    
  3.       devise_for :users:path_names => { :sign_up => "register" }    
  4.         
  5.       resources :projects    
  6.       root :to => 'projects#index'    
  7.     end    



当我们完成上面的修改之后,当我们再试图通过/users/sign_up来注册的时候就会看到没有路由的错误信息,而通过/users/register就可以正常注册。对于devise_for的路由还有很多其他的参数来帮助定制路由,这可以通过参考devise的文档得到。 

定制登录信息 

当前devise的配置是通过用户email和用户口令登录。那么,很可能有些项目需要用用户名登录,devise也考虑到了这点,通过简单的配置就可以转换成用户名登录。 

Ruby代码   收藏代码
  1. $ rails generate migration add_username_to_users username:string  



首先,要用用户名登录就得先增加一个username的字段 

Ruby代码   收藏代码
  1. $ rake db:migrate  



因为当前我们只有一个用户,所以,我们不用谢migrate去处理之前没有username字段的数据,只要在控制台简单的修改一下就可以: 

Ruby代码   收藏代码
  1. $ rails c  
  2. Loading development environment (Rails 3.0.0.beta2)  
  3. ruby-1.8.7-p249 > User.first.update_attribute(:username"eifion")  
  4.  => true  



修改完数据库,已经有登录字段了,那么接着,我们要修改对应的配置文件/config/initializers/devise.rb来指明用不username登录。就是修改config.authentication_keys把 :email 变成 :username: 

Ruby代码   收藏代码
  1. #/config/initializers/devise.rb  
  2.     config.authentication_keys = [ :username ]    



这个配置的修改就可以通过username字段来验证登录,当然我们还应该修改/app/views/devise/sessions/new.html.erb页面,以便输入的字段也使用用户名。 

Ruby代码   收藏代码
  1. #/app/views/devise/sessions/new.html.erb  
  2.     <% title "Sign In" %>    
  3.         
  4.     <%= form_for(resource_name, resource, :url => session_path(resource_name)) do |f| %>    
  5.       <ol class="formList">    
  6.         <li><%= f.label :username %> <%= f.text_field :username %></li>    
  7.         <li><%= f.label :password %> <%= f.password_field :password %></li>    
  8.         <% if devise_mapping.rememberable? -%>    
  9.         <li><%= f.check_box :remember_me %> <%= f.label :remember_me %></li>    
  10.         <% end %>    
  11.         <li><%= f.submit "Sign in" %></li>    
  12.       </ol>    
  13.     <% end %>    
  14.         
  15.     <%= render :partial => "devise/shared/links" %>    



注册页面的表单也需要进行相关的修改,以便注册时能够添加用户名,当然对于的输入类型验证也应该包括用户名。和登录的表单类似就不展示了。 
当完成以上的配置修改之后,重启服务器我们就可以通过用户名登录了: 





这就是定制devise的内容了,通过上面的介绍,我们可以看到Devise是个相当完善的Rails权限管理系统,既有很好的默认配置,也支持灵活的定制。 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics