我有两个模型通过一个连接模型连接。join模型存储一个附加属性value,即布尔A Role具有许多通过RolePermission的Permissions,RolePermission存储该Role是否能够执行由Permission指示的操作。
每个Role都应该对每个Permission有一个RolePermission记录(其中有10条)。
然而,我在创建表单时遇到了困难。我希望每个Permission都有一个复选框,用于指示RolePermission的value属性的布尔值。
模型
class Role < ApplicationRecord
has_many :role_permissions, dependent: :destroy
has_many :permissions, through: :role_permissions
accepts_nested_attributes_for :role_permissions
end
class RolePermission < ApplicationRecord
belongs_to :role
belongs_to :permission
end
class Permission < ApplicationRecord
has_many :role_permissions
has_many :roles, through: :role_permissions
end表列
Roles
name: string
description: string
Permissions
name: string
description: string
RolePermissions
role: references
permission: references
value: boolean视图/角色/_form.html.erb
<%= form_for [@chronicle, @role], url: url do |f| %>
...
<%= f.fields_for :role_permissions, Permission.all do |ff| %>
???
<%= ff.label :name %>
<%= ff.check_box :value %>
???
<% end %>
<%= f.submit text, class: 'btn btn-primary btn-block' %>
<% end %>控制器/角色控制器.roles
class RolesController < ApplicationController
...
def create
@chronicle = Chronicle.find(params[:chronicle_id])
@role = @chronicle.roles.build(role_params)
???
@role_permissions = @role.role_permissions.build
???
if @chronicle.save
flash[:success] = 'Role successfully created.'
redirect_to chronicle_role_url(@chronicle, @role)
else
render 'new'
end
end
private
def role_params
params.require(:role).permit(:name, :description, role_permission_attributes: [] )
end
end
end发布于 2017-07-03 21:55:40
我仍然相信没有中间的Role_permission模型的概念。每个角色都应该有自己的权限(has_many)、,但是当每个角色都创建了权限时,权限名称和描述将被重用。
这就是我所做的。
我在角色控制器的私有部分创建了一个包含名称和描述值的散列。
# roles_controller.rb
def permission_values
{
"Can edit" => "This is not good if you want to party",
"Can show" => "Yes, yes, yes. Go ahead",
"Can hike" => "Oh my! A hike-role?",
"And so on" => "What do we have here?"
}
end然后,当我创建角色和权限时,我将.build与permission_values一起使用。
无法用seeds.rb完成,因为角色必须在分配权限之前创建
#roles_controller.rb
def new
@role = Role.new
permission_values.each do |titel, desc|
@role.permissions.build(name: titel, description: desc)
end
end在表单中,我使用.object和.hidden_field来显示和创建值。
# _form.html.erb
...
<%= f.fields_for :permissions do |ff|%>
<h4><%= ff.object.name %></h4>
<%= ff.hidden_field :name %>
<p><%= ff.object.description %></p>
<%= ff.hidden_field :description %>
<%= ff.check_box :permitted %>
<% end %>就在这里!
现在,每个用户都将显示相同的权限,但如果需要,他们可以检查“允许”,并使用其角色保存权限。在节目中,大概是:
# show.html.erb
# I would make a helper-method
# And some index-symbol-power!
<%= "Hey! I'm permitted to do this!" if @role.permissions.find_by_name("Can
edit").permitted? %>注:
请记住permission_attributes中role_params中的:id,这样在编辑时权限就不会重复。
========================================================================
发布于 2017-07-03 18:24:51
RolePermission模型是必要的吗?
如果我误解了什么,请告诉我。为什么不在权限模型上添加一个布尔属性呢?
表列:
Roles
name: string
description: string
Permissions
referenced: role
name: string
description: string
permitted: boolean现在,您可以在field_for中有一个复选框字段,没有任何问题。
#In form_for [@chronicle, @role], url: url do |f|
...
<%= f.fields_for :permissions do |ff| %>
<%= ff.label :permitted %>
<%= ff.check_box :permitted %>
... <!-- description and name -->和你的控制器
记住不要在视图中调用Permission.all,而是在.build中使用RolesController中的新操作。
def new
#Find @chronicle
@role = Role.new
10.times { @role.permissions.build }
end
def create
# If you set up your accepts_nested_attributes_for :permissions
# (delete the rest of role_permission stuff) in role.rb,
# and update your role_params with the permission_attributes everything should
be
# working fine. Find your role and save it.
end然后你可以做这样的事情:
if role.permissions.first.permitted?
# DO SOMETHING CRAZY
endhttps://stackoverflow.com/questions/44889752
复制相似问题