ruby-on-rails - Rails 复杂表单使用关联一次编辑多个记录

标签 ruby-on-rails ruby forms activerecord associations

我正在开发一种复杂的表单,可以同时更新一个模型的多个记录,同时更新关联的模型。它看起来有点像这样:

class Sport
  has_one :photo
end

class Photo
  belongs_to :sport
  acts_as_fleximage
end

class Page
  # the page is not related to either of the previous models
end

就一些背景信息而言,Page 模型是一个通用模型,用户可以为其创建任意数量的模型(CMS)。此外,他们在注册时会获得少量强制性“系统”页面。当他们尝试编辑系统页面时,该表单与通用页面表单略有不同。

其中一个系统页面是“体育”页面。他们可以在其中为每项运动添加一些文本(保存在“运动”模型中)并上传照片(保存在“照片”模型中)。

我精心设计了一个似乎可以解决问题的表单。我不会发布 View ,但这是它发送的参数示例:

:id => 1
:page => {"title"=>"Our sports"}
:sport => {
  "1" => {
    "description" => "<p>I love playing hockey...</p>"
    "photo_attributes" => {
      "image_file" => #<File:/tmp/RackMultipart20100126-955-k0gxu8-0>,
      "description" => "Me in my hockey kit"
    }
  },
  "2" => { #more of the same}
}

现在,为了保存所有这些,我的 Controller /操作看起来像这样:

def update_sports_page
  @page = Page.find params[:id]
  @page.update_attributes params[:page]
  Sport.update(params[:sport].keys, params[:sport].values)
  redirect_to #etc
end

现在,当我编辑体育页面时,一切都会正确保存和更新,除了,如果我更改照片,而不是它更新数据库中的现有记录,它只是创建一个新记录并设置 sport_id 的旧记录为 NULL

最终,经过多次编辑,数据库中出现了大量的孤立记录。

谁能发现我在这里做错了什么?

(ps,如果相关,我在照片模型上使用 fleximage)

最佳答案

这可能是正确的行为,因为该关联默认设置为 :dependent => :nullify,而不是 :dependent => :destroy。

也许可以通过以下方法修复它:

class Photo
  belongs_to :sport,
    :dependent => :destroy
end

这应该会自动为您删除孤立记录。

在执行任何查找或更新操作时,您还应该注意捕获异常。

def update_sports_page
  @page = Page.find params[:id]
  @page.update_attributes params[:page]

  params[:sport].each do |sport_id, sport_params|
    sport = Sport.find(sport_id)
    sport.update_attributes!(sport_params)
  end

  redirect_to #etc
rescue ActiveRecord::RecordNotFound
  render(:partial => 'page_not_found', :status => :not_found)
rescue ActiveRecord::RecordInvalid
  render(:action => 'edit')
end

这是一个例子。编辑和更新方法应该有一个通用的“运动加载器”机制,可以处理检索页面的所有相关记录,而不必在更新期间复制此功能。它负责捕获更新错误并将其显示在编辑页面上以供审核。

关于ruby-on-rails - Rails 复杂表单使用关联一次编辑多个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2139353/

相关文章:

javascript - 如何从 JavaScript 中的下拉列表中验证 DOB?

ruby-on-rails - 如何使用 Shopify gem 处理 Shopify API 连接?

ruby-on-rails - 由于未经验证的 SSL 认证,无法使用 Rails

ruby-on-rails - 从自定义 Controller 操作(Rails)注销设计 session

ruby - 访问哈希值和数组 Ruby

arrays - 如何替换数组中的重复元素?

ruby - 将文件读入内存的unix实用程序?

php - 按下另一个表单上的按钮后自动填写表单

java - 强制 "respond_do"格式

php - Symfony2 表单中实体字段类型的附加属性