假设我有一个简单的待办事项列表应用程序。该应用程序包含两个模型:
我希望在列表中有一个编辑屏幕,我可以在其中更新列表属性(例如描述),还可以创建/删除/修改相关项目。应该有一个“保存”按钮,它将提交所有更改。除非按下保存,否则应该忘记对列表和项目的任何更改。
我无法为此找到优雅的最佳做法。非常感谢对现有实施的任何建议和/或参考。
答案 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