我试图更新has_many:通过与Rails 4中的强参数关联而没有成功。
这是我的模型:

User
  has_many :group_owner, :class_name => "Group"
  has_many :group_memberships
  has_many :memberships, :through => :group_memberships, :class_name => "Group"
end

Group
  belongs_to :owner, :class_name => "User", :foreign_key => "user_id"
  has_many :user_members
  has_many :members, :through => :user_members, :class_name => "User"
end

在组视图中(创建/编辑)
    <%= form_for(:group, :url => {:action => 'update', :group_id => @group.id}) do |f| %>

        <th>New participant</th>
        <td><%= f.collection_select(:members, @users, :id, :first_name) %></td>

        <%= submit_tag("Update Group") %>
    <% end %>

然后,在控制器中,我尝试使用强参数将新成员保存到数据库中:
def groupe_params
  params.require(:group).permit(:user_id, :group_name, members: [:id])
end

但是用户没有保存在数据库中,我没有任何错误消息。
当我试着做的时候
 group.members << user

通过ruby控制台,它成功了。
我已经找了几个小时的解决办法了我试着从这个问题中理解解决办法,但我还是被卡住了。
我试图检查控制器中:members变量的值是什么:
 member_id = params[:members]
 flash[:notice] = "member id = #{member_id} !!"

它总是空的:
 member id = !!

但是,当我用强参数替换时:
def group_params
  params.require(:group).permit(:user_id, :group_name, members: [:id])
end

通过
def group_params
  params.require(:group).permit(:user_id, :group_name, :members)
end

我得到以下错误:
undefined method `each' for "1":String

{"utf8"=>"✓",
 "authenticity_token"=>"GxCd==",
 "group"=>{"name"=>"G7",
 "members"=>"1"},
 "commit"=>"Update Group",
 "group_id"=>"4"}

这说明:members变量不是空的!
欢迎任何帮助谢谢您。

最佳答案

根据您输入的参数,params[:members]不存在-它在params[:group][:members]。这就是为什么打印member_id失败的原因。我想你是想用group_params[:members]

member_id = group_params[:members]
flash[:notice] = "member id = #{member_id} !!"

第二个问题是members不是对象列表,因此指定members: [:id]将不起作用期望参数如下
group: {
  members: [
    {id: 1},
    {id: 2}
  ]
}

您只传递了一个id列表,因此需要members: [],它需要the question you linked to描述的标量值列表。
最后,您的has_many关联需要一个名为member_ids的属性,而不是members。因此,最终的强参数定义应该是:
def group_params
  params.require(:group).permit(:user_id, :group_name, member_ids: [])
end

这将允许您通过Group关系设置group.member_ids = [1,2,3]的成员。
似乎除了参数之外还有其他问题,因为您的has_manys有许多Users到Group,但是您的group_membershipss有许多Groups到User除非您有其他的配置补偿,否则您希望使用同一个表,其中包含user_members:user_id列,以使关系在两个方向上都正常工作。

关于ruby-on-rails - 如何更新has_many:通过与Rails 4中的强参数关联,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31466462/

10-13 01:57