【发布时间】:2017-04-21 05:47:22
【问题描述】:
Rails 新手又来了。
其实我在这个Having trouble in updating join model extra attributes in has_many through association - Rails中也问过类似的问题,但是觉得我问的方向错了,方式复杂,所以想开一个新的问题,问的更简单更准确。
想知道我何时在has_many through: 的连接模型中有一个额外的属性,保存和更新连接模型的额外属性的标准方法是什么。下面只是一个例子和我尝试过的:
在一个Forum中,一个User有很多Group;一个Group 有很多User,到GroupUser。
class User < ApplicationRecord
has_many :group_users
has_many :groups, through: :group_users
end
class Group < ApplicationRecord
belongs_to :forum
has_many :group_users
has_many :users, through: :group_users
end
class GroupUser < ApplicationRecord
belongs_to :group
belongs_to :user
end
class Forum < ApplicationRecord
has_many :groups
end
由于某种原因,我可能想在连接模型GroupUser中添加一个额外的属性forum_id所以它变成了:
在控制器中执行create 和update 的正确方法是什么?
我尝试过类似的方法:
def create
@forum = Forum.find(params[:forum_id])
@group = @forum.groups.build(group_params)
@group.group_users.each do |join|
join.forum_id = @group.forum_id
end
@group.save
end
def update
@group = Group.find(params[:id])
@group.group_users.each do |join|
join.forum_id = @group.forum_id
end
@group.update(group_params)
end
private
def group_params
params.require(:group).permit(:name, user_ids: [])
end
我可以将forum_id保存在create中;但是,在关联中执行 update 时,forum_id 将为零。它已经和我接壤了二十多个小时,我真的很想知道保存和更新连接模型的额外属性的标准方法。
感谢您阅读我的文字。欣赏任何cmets。每一个建议都会减轻我现在的头痛。谢谢。
12 月 7 日上午 10:17 +8 更新
我尝试了accepted_nested_attributes_for 解决方案,但没有成功,我仍然可以在save 中插入forum_id,但仍然无法在update 中插入forum_id,更新的记录将获得@987654346 @
变化如下:
型号:
class Group < ApplicationRecord
belongs_to :forum
has_many :group_users, inverse_of: :group
has_many :users, through: :group_users
accepts_nested_attributes_for :group_users
end
控制器:
def group_params
params.require(:group).permit(:name, user_ids: [], group_users_attributes: [:id, :forum_id])
end
我实际上已经创建了一个项目,你可以在这里下载:https://github.com/kan1011/rails-101-demo(如果你想运行它,你需要在rails c中创建第一个论坛,f = Forum.new和f.save)
2016 年 8 月 12 日下午 12:53 +8 点更新
尝试使用save代替update(params),但根本没有更新,提交更新表单后记录不变。
尝试使用puts params.inspect和puts group_params.inspect,结果如下:
参数
Parameters: {"utf8"=>"✓", "authenticity_token"=>"s8l+wWzTci7hD1AoyLN9sIjFu296ooU0VwWgCFIP4yvJaR7I3HS9E3ja4VXcFQv1QadyeJspef3dBD1XzVaF+Q==", "group"=>{"name"=>"fff", "user_ids"=>["", "1", "2", "3"]}, "commit"=>"Submit", "id"=>"8"}
"✓", "_method"=>"put", "authenticity_token"=>"s8l+wWzTci7hD1AoyLN9sIjFu296ooU0VwWgCFIP4yvJaR7I3HS9E3ja4VXcFQv1QadyeJspef3dBD1XzVaF+Q==", "group"=>{"name"=>"fff"="user_id >["", "1", "2", "3"]}, "commit"=>"提交", "controller"=>"groups", "action"=>"update", "id"= >“8”} 允许:假>
组参数
<ActionController::Parameters {"name"=>"fff", "user_ids"=>["", "1", "2", "3"]} permitted: true>
【问题讨论】:
标签: ruby-on-rails ruby join crud