Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4:为多角色定制Desive 3.1.0_Ruby On Rails_Devise_Customization - Fatal编程技术网

Ruby on rails Rails 4:为多角色定制Desive 3.1.0

Ruby on rails Rails 4:为多角色定制Desive 3.1.0,ruby-on-rails,devise,customization,Ruby On Rails,Devise,Customization,我在使用Desive时遇到问题。这不是一个真正的问题,而是一个“我不知道怎么做” 实际上,我正在Rails 4应用程序上使用Desive 3.1.0。到目前为止,我只有我的注册,用户可以通过注册进入系统 问题是,现在,我正在为每个用户添加组和角色,因为每个用户都属于一个特定的组(公司本身)。所以在这种情况下,当用户第一次注册时,他注册为管理员并创建他的公司。但是假设在这个应用程序的内部,这个管理员想要创建其他用户,这些用户都属于那个SEPCFIC公司 我知道我可以覆盖design::Regist

我在使用Desive时遇到问题。这不是一个真正的问题,而是一个“我不知道怎么做”

实际上,我正在Rails 4应用程序上使用Desive 3.1.0。到目前为止,我只有我的
注册
,用户可以通过注册进入系统

问题是,现在,我正在为每个用户添加组和角色,因为每个用户都属于一个特定的组(公司本身)。所以在这种情况下,当用户第一次注册时,他注册为管理员并创建他的公司。但是假设在这个应用程序的内部,这个管理员想要创建其他用户,这些用户都属于那个SEPCFIC公司

我知道我可以覆盖
design::RegistrationController
,但是看着他们原来的
update
方法,我觉得如果我复制他们的代码并修改我的代码以使其正常工作,代码就会膨胀

我特别关心的是
强参数
。让我解释一下,实际上我覆盖了
designe::RegistrationsController
上的
account\u update\u参数,因为它:

protected
  def account_update_params
    params.require(:user).permit(:lastname, :firstname, :email, :current_password, :password, :password_confirmation)
  end
但是,如果我想从应用程序中添加帐户作为管理员,我还需要允许
:role
,这可能是注册表表单中的安全问题。如果有人试图在注册时向角色中注入一些东西会怎么样

如何以最佳方式仅允许在应用程序内部使用
:角色
,而不允许在注销时使用


谢谢大家

是的,我也讨厌覆盖Desive控制器。Desive的部分问题在于它可能有点僵化和不可固化

在routes.rb文件中,创建新路由

get '/users/sign_up_as/:role' => 'devise/registrations/#new', :as => 'new_user_registration'
然后使用该行修改“设计注册”视图

<%= f.hidden_field :role, :value => params[:role] %>
此外,请记住,您无需为表格本身使用设计注册控制器。如果您运行
User.create
,Desive仍将发送确认电子邮件等。

以下是我的操作方法

假设: 1.当用户注册时,他是新公司的管理员 2.用户可以由管理员在应用程序中创建,也可以由您应用的其他逻辑创建

首先,在app/models/User.rb中为用户模型创建一个after_create

class User < ActiveRecord::Base
  after_create :set_account_and_admin

  protected
   def set_account_and_admin

   if self.account_id.nil?
     @account = Account.create!
     self.update(account_id: @account.id, admin: true)
   end
 end
现在,当有人进入你的注册应用程序并输入用户/密码时,他们将获得一个新帐户,用户模型将为你创建一个新帐户,并将该新用户设置为管理员

如果该用户登录,他们可以创建新用户,则Desive将看到该用户已登录,并将新用户分配到当前用户帐户

现在,您可以为管理员/组以及可以创建新用户的用户添加任何逻辑,而不必担心将逻辑添加到表单中


另一种替代方法是在控制器中执行单独的操作,如“inappcreate”,并转到用户表单中的操作。

谢谢您的帮助。我不知道使用
User.create
仍然可以使身份验证引擎工作。知道这一点解决了我的问题。谢谢:)酷,是的,我花了好几天的开发时间在Desive上,试图克服这样的问题。Desive非常棒,但很难定制。
class User < ActiveRecord::Base
  after_create :set_account_and_admin

  protected
   def set_account_and_admin

   if self.account_id.nil?
     @account = Account.create!
     self.update(account_id: @account.id, admin: true)
   end
 end
def create
  build_resource(sign_up_params)

  if current_user
    resource.account_id = current_user.account_id
  end

  #...rest of devise stuff taken from the gem
end