在事务块失败后,从params哈希构建对象数组,Rails

我有一个表单,用户可以同时更新多个资源。 事务块使表单成为primefaces:如果对任何正在更新的资源进行一次validation失败,则不会更新任何资源,并且活动记录将回滚所有更改。

当事务失败时,我想再次呈现表单,显示用户输入的相同输入以及每个错误输入字段旁边的错误,这些错误阻止事务通过。

事务块工作。 我遇到的麻烦是从params日志构建对象数组。 数组的每个索引都应包含一个哈希,该哈希保存特定资源的所有属性的键/值对。

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 

并且为了更好地衡量,这是传递的参数在日志中的样子。 此事务失败,因为name属性必须至少为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中的对象列表,你真的不想这样做。 我建议这样的事情:

 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传递的每个用户对象以及与每个值关联的值生成新用户。