Rolify和Rails 4角色管理

时间:2014-12-29 15:25:57

标签: ruby-on-rails-4 devise rolify pundit reform

我正在尝试在我的rails 4应用程序中实现基于角色的访问系统,我希望最终用户(super_admin)能够通过UI编辑角色分配。

我取得了一些成功,但无法感觉必须有更好的方法(因为我是铁杆新手)。这是我的代码:

users_roles_controller.rb

# GET /user_roles/new/:id
def new
  @roles = Role.all
end 

# POST /user_roles/new/:id
def create
  populated = params[:roles][:name].reject(&:empty?)
  populated.each do |key|
    @user.add_role  Role.find(key).name
  end 

  redirect_to users_path
end 

在我的表格中(HAML和simple_form):

= simple_form_for :roles, :url => create_user_roles_path(@user.id), :method => "post" do |f|

= f.input :name, :collection => @roles,   as: :check_boxes

= f.button :submit

我正在努力解决以下问题:

  1. 如何验证表单条目,因为没有模型?
  2. 我应该使用强参数吗?如果是,我如何在没有模型的表单上实现
  3. 如何创建类似的内容,但是已经检查了当前角色? (真正的角色管理)
  4. UPDATE 我已按照评论的建议考虑使用改革宝石。这似乎是一个很好的解决方案。但是,我对此案例的实施存在问题。

    让我把它映射出来: 我在数据库中有3个表:

    1. 用户
    2. users_roles(具有2个属性的映射表:user_id& role_id {Join Table - > HABTM})
    3. 角色
    4. 我想构建一个表单,其中Roles模型中的所有值都是复选框。复选框应该指示哪些值被输入到users_roles表中(与特定用户有关)。我想要改革的是验证这个表格的输入。此表单将始终显示角色中的所有值,但部分/全部框可能未选中。

      我在我的应用中创建了一个表单文件夹,并使用以下代码开始:

      class UserRoleForm < Reform::Form
      
      property :user__id, on: :user
      property :role_id, on: :role
      
      validates :user__id, presence: true
      validates :role__id, presence: true
      end
      

      我是朝着正确的方向前进的吗?

      感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

构建表单需要两件事:用户的角色和可能的角色。

如果我没记错,rolify会为您提供模型关联广告,只需让您执行some_user.roles之类的操作即可返回应用于some_user的所有角色。

要获得可能的角色,请尝试Role.all

要结合两者,请尝试

user_roles = some_user.roles.pluck(:name) # suppose this returns ["admin"]
Role.pluck(:name).map { |r| [r, user_roles.include?(r)] }

现在你有一个这样的数组,你可以使用它来构建每个循环的表单复选框。

 [["customer", false], ["admin", true], ["editor", false]]

定义您的改革对象的同步或保存方法,以处理如何处理提交的输入,但是您正在处理它。您可以(应该)进行自定义验证,以验证提交的角色是否是有效角色。