Rails 4 update_attributes,嵌套属性不保存

时间:2015-11-20 17:08:19

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

我正在尝试将我的应用的注册过程分解成一个很好的一口大小的块。

所以我通过Ajax发布表单,只是尝试更新该流程中该步骤可用的某些模型属性,这基本上意味着它们在每个流程中都无法生效保存点。

因此,我一直在使用update_attribute,它可以正常工作。但是,我的一个属性是has_many关联,而我正在努力使其发挥作用。

我的Channel模型包含has_many :channel_tags,还有accepts_nested_attributes_for :channel_tags。使用更新方法时保存和更新工作正常,但我无法使用update_attributeupdate_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,然后加载类别。

我做错了什么,或者有更好的方法吗?

2 个答案:

答案 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。