Rails设计基于注册路径添加角色

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)


And*_*itt 6

我会建立一条路线,如:

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)

那么您根本不需要更改控制器代码.