在交易块失败后,从参数哈希构建对象数组



我有一个表单,用户可以同时更新多个资源。交易块使表格原子:如果一个验证因要更新的任何资源而失败,则没有任何资源会更新,并且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以及与每个值关联的值生成新用户的新用户。

相关内容

  • 没有找到相关文章

最新更新