如何通过与Rails 4

时间:2015-07-16 23:59:30

标签: ruby-on-rails ruby ruby-on-rails-4

我尝试更新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 %>

然后,在控制器中,我尝试使用强参数将新成员保存在DB中:

def groupe_params
  params.require(:group).permit(:user_id, :group_name, members: [:id])
end

但是用户没有保存在数据库中,我也没有任何错误消息。 我试图做的时候

 group.members << user

通过ruby控制台,它成功了。

我已经花了几个小时寻找解决方案。我试图理解这个问题的解决方案(How to use Rails 4 strong parameters with has_many :through association?),但我仍然坚持。

我试图检查控制器中: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 变量不为空!

欢迎任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

根据您的传入参数,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_many成员。

看起来可能存在除参数之外的问题,因为User有很多Groupgroup_memberships,但您的Group有很多User 1}}通过user_members。除非您有其他配置补偿,否则您希望在:user_id:group_id列中使用相同的表格,以使关系在两个方向上正常运行。