我正在尝试将我的应用的注册过程分解成一个很好的一口大小的块。
所以我通过Ajax
发布表单,只是尝试更新该流程中该步骤可用的某些模型属性,这基本上意味着它们在每个流程中都无法生效保存点。
因此,我一直在使用update_attribute
,它可以正常工作。但是,我的一个属性是has_many
关联,而我正在努力使其发挥作用。
我的Channel
模型包含has_many :channel_tags
,还有accepts_nested_attributes_for :channel_tags
。使用更新方法时保存和更新工作正常,但我无法使用update_attribute
或update_attributes
。
据我所知,我需要使用update_attributes
。我想做类似的事情:
@channel.update_attributes(channel_tags_attributes: params[:channel][:channel_tags_attributes])
但是这并没有创建新的channel_tags。我也尝试过:
@channel.update_attributes(tag_params)
和
params.require(:channel).permit(channel_tags_attributes: [ :id, :channel_id, :tag_id, :_destroy ]);
但同样,它似乎并没有做任何事情。
从控制台检查时,似乎所有这一切都在发生,因为它正在为数据库加载Channel
,然后加载类别。
我做错了什么,或者有更好的方法吗?
答案 0 :(得分:0)
尝试将名称更改为允许参数方法: -
def channel_params
params.require(:channel).permit(channel_tags_attributes: [ :id, :channel_id, :tag_id, :_destroy ]);
end
并在更新属性中使用此方法: -
def update
@channel = Channel.find(params[:id])
if @channel.update_attributes(channel_params)
# add your code here
end
end
答案 1 :(得分:-1)
当您尝试使用rails 4中的嵌套属性时,您的代码应该是,
在标签模型中
has_many :channel_tags
accepts_nested_attributes_for :channel_tags, allow_destroy: true
控制器应该看起来像
def update
@tag = Tag.find(params[:id])
puts "==== #{tag_params.inspect} ===="
puts "==== #{tag_params[:channel_tags].inspect} ===="
if @tag.update!(tag_params)
redirect_path
end
end
private
def tag_params
params.require(:tag).permit(:name ,channel_tags_attributes: [:id, :channel_id, :tag_id, :_destroy])
end
更新属性时,请检查服务器日志,因为我检查了您尝试更新标记属性的参数。
.update_attributes仅在您需要特定属性时才会出现。 .update将在我们定义为强对数的参数中使用HASH。