Rails:更新项目以及相关项目

时间:2010-05-05 14:54:05

标签: ruby-on-rails

假设我有一个简单的待办事项列表应用程序。该应用程序包含两个模型:

  • 列出(拥有所有者和说明)
  • 属于特定列表的项目(具有名称和截止日期)

我希望在列表中有一个编辑屏幕,我可以在其中更新列表属性(例如描述),还可以创建/删除/修改相关项目。应该有一个“保存”按钮,它将提交所有更改。除非按下保存,否则应该忘记对列表和项目的任何更改。

我无法为此找到优雅的最佳做法。非常感谢对现有实施的任何建议和/或参考。

2 个答案:

答案 0 :(得分:3)

您应该可以在accepts_nested_attributes_for关联上使用has_many进行此操作。引自Rails API docs

  

考虑一个拥有多个成员的成员   帖子:

  class Member < ActiveRecord::Base
    has_many :posts
    accepts_nested_attributes_for :posts
  end
  

您现在可以设置或更新属性   通过相关的帖子模型   属性哈希。对于每个哈希   没有id键新记录   将被实例化,除非哈希   还包含一个_delete键   评估为真。

  params = { :member => {
    :name => 'joe', :posts_attributes => [
      { :title => 'Kari, the awesome Ruby documentation browser!' },
      { :title => 'The egalitarian assumption of the modern citizen' },
      { :title => '', :_delete => '1' } # this will be ignored
    ]
  }}

  member = Member.create(params['member'])
  member.posts.length # => 2
  member.posts.first.title # => 'Kari, the awesome Ruby documentation browser!'
  member.posts.second.title # => 'The egalitarian assumption of the modern citizen'

Railscast 196中也有一个很好的解释,它说明了如何使用嵌套属性设置表单。

答案 1 :(得分:0)

尝试以下内容

@list = List.find(params[:id])
@item = @list.item
@list.attributes=params[:list]    
@item.attributes=params[:item]    
# (@list.valid? & @item.valid?) this is used for retrieving error message for both list and item
if (@list.valid? & @item.valid?) &&  @list.save  && @item.save
  flash[:notice] = "List updated successfully."
  redirect_to :action => "list_details", :id => @list.id 
else
  return(render (:action => 'edit_list', :id =>@list.id))
end