首页 文章

如何以及在何处处理相关记录的更新过程?

提问于
浏览
4

我正在使用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_idname 列表中数据的唯一性,可能会按顺序搜索这些列中的数据检查是否需要更新或创建新记录 . 实际上,在"edit article"视图中,我显示了一个表单,其中包含用于编辑类别的输入字段,包括预先填充了与现有类别相关的数据的字段,以及可由编辑器用户创建的类别的空字段 .

我该如何正确处理这种行为?它是模型还是控制器的责任?或者,是否有更好的方法直接在“编辑文章”视图中管理类别?

2 回答

  • 0

    我相信您需要为嵌套模型允许 :id 属性:

    def update_params
      params.require(:article).permit(
        :title,
        ...,
        :categories_attributes => [:id, :name, ...]
      )
    end
    

    如果您希望能够使用嵌套参数销毁类别,则还需要添加 :_destroy . Rails Guides有完整的故事 .

  • 0

    您应该在 Article 模型中添加 categories_attributes 作为 attr_accessible . 喜欢:

    attr_accessible :categories_attributes
    

    如果没有这一行,您将面临上述问题,创建新记录而不是更新现有记录 . 还有一个名为 nested_form 的宝石,它在构建这些复杂形式方面做得非常出色 .

相关问题