0

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

我已经取得了一些成功,但不禁感到必须有更好的方法(因为我是 Rails 新手)。这是我的代码:

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. 我如何创建类似的东西,但已经检查了当前角色?(真正的角色管理)

更新我已经按照评论的建议使用了改革 Gem。这似乎是一个很好的解决方案。然而,我对这个案例的实施有疑问。

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

  1. 用户
  2. users_roles(具有 2 个属性的映射表:user_id & role_id {Join Table -> HABTM})
  3. 角色

我想构建一个表单,其中包含角色模型中的所有值作为复选框。复选框应指示将哪些值输入 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

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

谢谢您的帮助。

4

1 回答 1

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]]

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

于 2014-12-29T19:38:17.910 回答