Ruby on rails Rails通过params数组循环并保存记录

Ruby on rails Rails通过params数组循环并保存记录,ruby-on-rails,postgresql,loops,associations,Ruby On Rails,Postgresql,Loops,Associations,好的,我的postgresql数据库中有两个表与我的问题有关: Table: roles Fields: | id | name | description | active | ----------------------------------------------------------- | | | | | Table: role_p

好的,我的postgresql数据库中有两个表与我的问题有关:

Table: roles

Fields:

|    id    |    name    |    description    |    active   |
-----------------------------------------------------------
|          |            |                   |             |


Table: role_permissions

Fields:

|    id    |    role_id    |    permission_id    |
--------------------------------------------------
|          |               |                     |
权限本身存储在单独的
权限
表中,该表充当定义表

以下是我的模型关系的样子:

Role:
    has_many :role_permissions, :dependent => :destroy

Role_Permission:
    belongs_to :role
我必须创建一个新的
角色的表单
如下所示:

<%= form_for([:admin, @role], html: {role: "form"}) do |f| %>
  <%= render "admin/shared/error_messages", obj: @role %>
  <fieldset>
    <legend>General Information</legend>
    <div class="form-group">
      <%= f.label :name, "Role Name" %>
      <span class="help-block">Used to identify the role in code files.</span>
      <%= f.text_field :name, class: "form-control" %>
    </div>
    <div class="form-group">
      <%= f.label :description %>
      <span class="help-block">What is this role used for?</span>
      <%= f.text_area :description, class: "form-control" %>
    </div>
  </fieldset>
  <fieldset>
    <legend>Role Permissions</legend>
    <% @permissions.each do |p| %>
      <label>
        <%= check_box_tag "role[role_permissions][][permission_id]", p.id %>
        <%= p.name %>
      </label>
    <% end %>
  </fieldset>
  <%= f.submit "Save Role", class: "btn btn-primary" %>
  <%= link_to "Cancel", :back, class: "back-btn" %>
<% end %>
我可以使用此选项保存角色本身:

@role = Role.new(role_params)
if @role.save
  flash[:success] = "Role has been successfully created!"
  redirect_to admin_roles_path
else
  setup_subnav("users")
  flash[:danger] = "Something went wrong! Please try again."
  render :new
end
我有点困惑的部分是如何让
role\u permissions
param数组保存为
role\u permissions
表中的单个记录。如您所见,我需要使用它们的
权限\u id
和“父”
角色\u id
保存它们


如何获取表单以保存个人
role\u权限
记录?谢谢你的帮助

将此添加到您的角色模型中

 accepts_nested_attributes_for :role_permissions
在控制器中

def role_params
    params.require(:role).permit(:name, :description, {:role_permissions_attributes => [:permission_id]})
end
鉴于:

<%= check_box_tag "role[role_permissions_attributes][][permission_id]", p.id %>

它应该为参数中role_权限数组内的每个哈希创建role_权限记录

更新:

以编辑形式

<%= check_box_tag "role[role_permissions_attributes][][permission_id]", p.id, role.role_permissions.collect(&:permission_id).include?(p.id) %>

加载项角色

接受:角色权限的\u嵌套\u属性\u 及 属性可访问:角色权限属性


提示:功能类似,但方法不同

角色:
拥有和属于多个权限

权限:
_和_属于_很多角色吗

许可孔:
属于:角色 属于:许可

鉴于

<%= check_box_tag "permissions[]", role_permission.id, @role_permissions.include?(role_permission.id), { array: true} %>


您正在使用哪个版本的rails?我的应用程序实际上使用rails 4,因此
属性可访问:角色权限属性
不起作用。我将其添加到我的role.rb模型中,它保存了
角色
,但没有保存
角色权限
。我是否需要触摸上面表单中的任何内容或
角色\u控制器中的
创建
操作?看到您的更新,仍然没有保存
角色\u权限
…表单中的此行是否正确<代码>
看起来,它需要是
角色\u权限\u属性
。更新了我的应答器,使其正确保存…但是,在我的
编辑
操作中,默认情况下不会选中复选框。我是否需要在这条线上手动执行此操作<代码>谢谢您的更新!先生,你真棒!最后一个问题,我保证。当我取消选中以前选中的内容时,我希望将其从
角色\u权限
数据库中删除。我是否应该删除该表中具有该
角色\u id
的所有内容,然后重新添加任何已检查的内容?如果我保存多次,它就会创建重复项……这也会缓解这个问题。
<%= check_box_tag "permissions[]", role_permission.id, @role_permissions.include?(role_permission.id), { array: true} %>