我尝试更新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 变量不为空!
欢迎任何帮助。谢谢。
答案 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
有很多Group
到group_memberships
,但您的Group
有很多User
1}}通过user_members
。除非您有其他配置补偿,否则您希望在:user_id
和:group_id
列中使用相同的表格,以使关系在两个方向上正常运行。