Hou*_*uen 6 ruby-on-rails devise ruby-on-rails-3
我正在构建一个Rails 3系统,我需要根据用户在网站上注册的路径为用户提供特定的角色.我正在使用Devise和Cancan.
例如,路径
new-fundraiser(或/users/new/fundraiser)
需要设置user.fundraiser = true用户创建,和
new-charity-user(或/users/new/charity)
需要设置user.charity_owner = true用户创建.
使用Devise和Cancan实现这一目标的最简单/最佳实践方法是什么?
cai*_*nne 10
感谢@ andrew-nesbitt的精彩回答.最初的问题表明@Houen已经在某种程度上定制了Devise.这是一个略微调整的答案,适用于开箱即用的Devise设置和多对多用户角色CanCan设置.
首先,在您的路线中添加:
devise_scope :user do
match "/users/sign_up/:initial_role" => 'devise/registrations#new', :as => 'new_user_with_role'
end
Run Code Online (Sandbox Code Playgroud)
然后你可以参考这条路线,如:
<%= link_to 'here', new_user_with_role_path(:initial_role => 'human') %>
Run Code Online (Sandbox Code Playgroud)
然后,在您的用户模型中添加
attr_accessible :initial_role
def initial_role=(role_name)
@initial_role = role_name
role = Role.find_by_name(role_name)
self.roles << role
end
def initial_role
@initial_role
end
Run Code Online (Sandbox Code Playgroud)
最后在views/devise/registrations/new.html.erb中添加
<%= f.hidden_field :initial_role, :value => params[:initial_role] %>
Run Code Online (Sandbox Code Playgroud)
我会建立一条路线,如:
match "/users/new/:role", :to => 'users#new'
Run Code Online (Sandbox Code Playgroud)
在您的用户模型中,我将添加一个访问者:
class User < ActiveRecord::Base
def role=(role_name)
@role = role_name
case role_name
when 'charity'
self.charity_owner = true
when 'fundraiser'
self.fundraiser = true
else
# raise some exception
end
end
def role
@role
end
end
Run Code Online (Sandbox Code Playgroud)
然后在您的用户#new.html.erb表单中添加一个隐藏字段:
<%= form.hidden_field :role, :value => params[:role] %>
Run Code Online (Sandbox Code Playgroud)
那么您根本不需要更改控制器代码.
| 归档时间: |
|
| 查看次数: |
3384 次 |
| 最近记录: |