首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套表单有许多:通过连接模型,其中联接模型有附加属性。

嵌套表单有许多:通过连接模型,其中联接模型有附加属性。
EN

Stack Overflow用户
提问于 2017-07-03 15:52:07
回答 2查看 94关注 0票数 0

我有两个模型通过一个连接模型连接。join模型存储一个附加属性value,即布尔A Role具有许多通过RolePermissionPermissionsRolePermission存储该Role是否能够执行由Permission指示的操作。

每个Role都应该对每个Permission有一个RolePermission记录(其中有10条)。

然而,我在创建表单时遇到了困难。我希望每个Permission都有一个复选框,用于指示RolePermissionvalue属性的布尔值。

模型

代码语言:javascript
复制
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

表列

代码语言:javascript
复制
Roles
    name: string
    description: string

Permissions
    name: string
    description: string

RolePermissions
    role: references
    permission: references
    value: boolean

视图/角色/_form.html.erb

代码语言:javascript
复制
<%= 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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-03 21:55:40

我仍然相信没有中间的Role_permission模型的概念。每个角色都应该有自己的权限(has_many)、,但是当每个角色都创建了权限时,权限名称和描述将被重用。

这就是我所做的。

我在角色控制器的私有部分创建了一个包含名称和描述值的散列。

代码语言:javascript
复制
# 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完成,因为角色必须在分配权限之前创建

代码语言:javascript
复制
#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来显示和创建值。

代码语言:javascript
复制
# _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 %>

就在这里!

现在,每个用户都将显示相同的权限,但如果需要,他们可以检查“允许”,并使用其角色保存权限。在节目中,大概是:

代码语言:javascript
复制
# 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,这样在编辑时权限就不会重复。

========================================================================

票数 1
EN

Stack Overflow用户

发布于 2017-07-03 18:24:51

RolePermission模型是必要的吗?

如果我误解了什么,请告诉我。为什么不在权限模型上添加一个布尔属性呢?

表列:

代码语言:javascript
复制
Roles
name: string
description: string

Permissions
referenced: role
name: string
description: string
permitted: boolean

现在,您可以在field_for中有一个复选框字段,没有任何问题。

代码语言:javascript
复制
#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中的新操作。

代码语言:javascript
复制
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

然后你可以做这样的事情:

代码语言:javascript
复制
if role.permissions.first.permitted? 
# DO SOMETHING CRAZY
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44889752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档