我正在使用Ruby on Rails 4,我想通过 update_attributes
方法正确处理相关记录的更新和创建过程 . 也就是说,我有以下内容:
# Model
class Article < ActiveRecord::Base
has_many :categories
accepts_nested_attributes_for :categories
end
# Controller
class ArticlesController < ApplicationController
def update
@article = Article.find(params[:id])
@article.update_attributes(update_params)
...
end
private
def update_params
params.require(:article).permit(:title, ..., :categories_attributes => [:name, ...])
end
end
# Logger for the update request
Started PATCH "/articles/6"
Processing by ArticlesController#update
Parameters: {"utf8"=>"✓", "article"=>{"title"=>"Sample title", "categories_attributes"=>{"0"=>{"name"=>"Sample Category 1", "..."=>"..."}, "1"=>{"name"=>"Sample Category 2", "..."=>"..."}, : "..." => {...}}
...
这个问题与Rails处理更新数据库中相关记录的方式有关,在我通过 @article
对象更新类别的情况下:提交数据时触发 update
动作并将参数传递给 update_attributes
方法(如图所示)在上面的 Logger 中)然后Rails在数据库中创建新的类别记录,一个用于散列 categories_attributes
中存在的每个元素 .
但是,我的目的是更新现有类别记录(如果存在)或创建新类别记录(如果不存在),相应于 article_id
和 name
列表中数据的唯一性,可能会按顺序搜索这些列中的数据检查是否需要更新或创建新记录 . 实际上,在"edit article"视图中,我显示了一个表单,其中包含用于编辑类别的输入字段,包括预先填充了与现有类别相关的数据的字段,以及可由编辑器用户创建的类别的空字段 .
我该如何正确处理这种行为?它是模型还是控制器的责任?或者,是否有更好的方法直接在“编辑文章”视图中管理类别?
2 回答
我相信您需要为嵌套模型允许
:id
属性:如果您希望能够使用嵌套参数销毁类别,则还需要添加
:_destroy
. Rails Guides有完整的故事 .您应该在
Article
模型中添加categories_attributes
作为attr_accessible
. 喜欢:如果没有这一行,您将面临上述问题,创建新记录而不是更新现有记录 . 还有一个名为
nested_form
的宝石,它在构建这些复杂形式方面做得非常出色 .