簡體   English   中英

Rails Devise 根據注冊路徑添加角色

[英]Rails Devise add role based on signup path

我正在構建一個 Rails 3 系統,我需要根據用戶在網站上注冊的路徑為他們提供特定的角色。 我正在使用 Devise 和 Cancan。

例如,路徑

new-fundraiser (或/users/new/fundraiser

需要在創建用戶時設置user.fundraiser = true ,並且

new-charity-user (或/users/new/charity

需要在用戶創建時設置user.charity_owner = true

使用 Devise 和 Cancan 完成此任務的最簡單/最佳實踐方法是什么?

感謝@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

然后,您可以參考此路線,例如:

<%= link_to 'here', new_user_with_role_path(:initial_role => 'human') %>

然后,在您的用戶 model 添加

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

最后在 views/devise/registrations/new.html.erb 添加

<%= f.hidden_field :initial_role, :value => params[:initial_role] %>

我會設置如下路線:

match "/users/new/:role", :to => 'users#new'

在您的用戶 model 中,我將添加一個訪問器:

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

然后在您的 users#new.html.erb 表單中添加一個隱藏字段:

<%= form.hidden_field :role, :value => params[:role] %>

那么您根本不需要更改 controller 代碼。

使用開箱即用的 Devise 和 CanCan,我根據 Rails Casts #189 “Embedded Association”設置了我的用戶“角色”。 但是,我無法讓@cailinanne 的答案與我的設置一起使用,因為假設了不同的角色方法。 如果有人有類似的問題,這是一種從@cailinanne 的答案中借用的不太優雅/穩健的方法。 它的一個優點是不需要修改用戶 model。

使用@cailinanne 提供的“devise_scope”路由和“link_to”代碼。 跳過對用戶 model 的更改。 最后在views/devise/registrations/new.html.erb中使用如下代碼:

  <% if params[:initial_role] == "admin" %>
    <%= hidden_field_tag "user[roles][]", :admin %>
  <% elsif params[:initial_role] == "moderator" %>
    <%= hidden_field_tag "user[roles][]", :moderator %>
  <% elsif params[:initial_role] == "author" %>
    <%= hidden_field_tag "user[roles][]", :author %>
  <% end %>

此代碼替換 Rails Cast 代碼中提供的 check_box_tag 代碼。

這肯定需要更多的工作。 我將在某個時候將 if-elsif-elsif 邏輯移動到 controller 中,並將其引用到 User.ROLES 以便在我添加/刪除角色時它不會中斷。 但是,如果您采用 Rails Casts“角色”方法,這將幫助您完成初始角色分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM