Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails复杂表单使用关联一次编辑多条记录_Ruby On Rails_Ruby_Forms_Activerecord_Associations - Fatal编程技术网

Ruby on rails Rails复杂表单使用关联一次编辑多条记录

Ruby on rails Rails复杂表单使用关联一次编辑多条记录,ruby-on-rails,ruby,forms,activerecord,associations,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 def update_sports_page @page =

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

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
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
只需要一点背景信息,页面模型是一个通用模型,用户可以创建任意数量的页面(CMS)。此外,他们在注册时会得到少量的强制性“系统”页面。当他们试图编辑系统页面时,表单与常规页面表单略有不同

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

我已经制作了一个表单,它似乎正在发挥作用。我不会发布视图,但下面是它发送的参数示例:

: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}
}
现在,当我编辑运动页面时,所有内容都正确保存和更新,除了如果我更改照片,而不是更新数据库中的现有记录,它只是创建一个新记录,并将旧记录的
sport\u id
设置为
NULL

因此,经过多次编辑后,数据库中最终会出现大量孤立记录

有人能看出我做错了什么吗


(请注意,如果相关,我在照片模型上使用)

这可能是正确的行为,因为该关联设置为:dependent=>:默认为null,而不是: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

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

您是否尝试过将
图像\u文件
字段临时更改为URL?我的怀疑是,这个问题与数据库中的数据球体有关,可能还有一些与之相关的bug。