我有一个表单,用户可以同时更新多个资源。交易块使表格原子:如果一个验证因要更新的任何资源而失败,则没有任何资源会更新,并且Active Record rollsback 所有更改。
当交易失败时,我想再次呈现表单,显示用户输入的相同输入以及每个错误输入字段旁边的错误,这阻止了交易通过。
交易块有效。我遇到的麻烦是从参数日志构建对象数组。数组的每个索引都应包含一个hash,该哈希具有特定资源的所有属性的密钥/值对。
udpate:以下是答案代码,借助响应
代码:
def update_multiple
begin
User.transaction do
params[:users].each do |k, v|
User.find(k).update!(v)
end
flash[:notice] = "Update Successful"
redirect_to :users and return
end
rescue
@users = []
params[:users].each do |k,v|
@users.push(User.new({:id => k}.merge(v)))
end
flash[:error] = "Errors found"
render :edit_multiple and return
end
end
和很好的衡量标准,这是日志中传递的参数的样子。此交易失败,因为名称属性必须至少3个字符长。
Parameters: {"utf8"=>"✓", "authenticity_token"=>"xyz=", "users"=>{"15"=>
{"name"=>"Neil", "age"=>"11"}, "16"=>{"name"=>"z", "age"=>"33"}, "17"=>
{"name"=>"John", "age"=>"99"}}, "commit"=>"Submit Changes"}
预先感谢!在Ruby中更好地编写此代码的任何方法也非常感谢。
好的,因此您正在尝试使用for_each和外部迭代器中的参数中的对象列表迭代,您真的不想这样做。我建议这样的事情:
params[:users].each do |k,v|
# k is the "key" of each user while v is the values associated with each key
@users.push(User.new(:id => k, v)
# I'm doing this in my head so you might need:
# @users.push(User.new({:id => k}.merge(v))
# if you start getting errors about looking for a proper hash or something
# I can't remember how good Rails/Ruby is at recognizing nested hashes
end
应该使用所提供的ID以及与每个值关联的值生成新用户的新用户。