2010-01-26 45 views
3

我正在开发一个复杂的表单,一次更新一个模型的几个记录,同时更新相关的模型。它看起来有点像这样:Rails复杂的表单一次编辑多条记录与协会

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 

只是为了一点背景资料,页面模型是一个通用模型,该用户将能够创建多达他们喜欢(一个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} 
} 

现在,为了保存这一切,我的控制器/动作看起来是这样的:

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在照片模式)

+0

您是否尝试过暂时将'image_file'字段更改为URL?我怀疑这个问题是与数据库中的数据空间有关,也可能是与它们有关的一些错误。 – 2010-01-26 17:39:53

回答

1

这可能是正确的行为,因为该关联设置:依赖=>:在默认情况下,不会令:依赖= >:毁灭。

可能可以与修复:

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 

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