加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何使用accepts_nested_attributes_for在连接

发布时间:2020-12-17 02:21:09 所属栏目:百科 来源:网络整理
导读:我目前使用 Ruby 2.0和Rails 4 beta创建了一个非常简单的设计. 我有用户和组.用户可以是多个组的成员,组可以有多个用户作为成员.因此,我有一个连接模型UserGroup,它只包含user_id和group_id.如下: class User ActiveRecord::Base has_many :user_groups,dep
我目前使用 Ruby 2.0和Rails 4 beta创建了一个非常简单的设计.

我有用户和组.用户可以是多个组的成员,组可以有多个用户作为成员.因此,我有一个连接模型UserGroup,它只包含user_id和group_id.如下:

class User < ActiveRecord::Base
    has_many :user_groups,dependent: destroy
    has_many :groups,through: :user_groups
    accepts_nested_attributes_for :user_groups,allow_destroy: true
end

class Group < ActiveRecord::Base
    has_many :user_groups,dependent: destroy
    has_many :users,through: :user_groups
end

class UserGroup < ActiveRecord::Base
    belongs_to :user,inverse_of: :user_groups
    belongs_to :group,inverse_of: :user_groups

    validates :user_id,presence: true
    validates :group_id,presence: true
end

我发现了很多关于accepts_nested_attributes_for的东西,它似乎表明在创建/更新时创建了一个关联的对象.我想要的是一个多选项选择框,我可以从系统中当前所有希望用户成为其成员的列表中选择多个选项,并在提交时它将为我生成所有user_group关联.

我无法在控制器或视图中找到我需要的东西以利用它.我目前有:

<%= form_for(@user) do |f| %>
    <div class="field">
        <%= f.label :username %><br />
        <%= f.text_field(:username) %>
    </div>

    <div class="field">
        <%= f.label :group_ids,'Group memberships' %><br />
        <%= f.select :group_ids,@groups.collect {|g| [g.name,g.id]},{},multiple: true %>
    </div>
<% end %>

在视图中:

def create
    @user = User.new(user_params)
    @user.save
end

def user_params
    params.require(:user).permit(:forename,:surname,:email,:group_ids)
end

在我的控制器中(以及我当前没有测试的所有其他动作当然).

这不起作用.当我转到具有组成员资格的现有用户的编辑页面时,他们在多项目选择框中正确显示,但更改成员资格或在新用户上设置它们不起作用.我的用户对象保存但没有创建或销毁任何相关的user_group对象.任何人都可以告诉我我在这里做错了什么以及我需要做些什么来让它工作?我花了几个小时在StackOverflow和谷歌上搜寻,无处可去……

解决方法

结果我真正需要做的是修复我的strong_parameters哈希.它导致我的params [:user] [:group_ids]被更新方法拒绝.我需要告诉strong_parameters它是一个简单属性的数组,因此:

def user_params
    params.require(:user).permit(:forename,group_ids: [])
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读