ruby 如何在rails中使用create方法创建多个记录并处理验证?

r6l8ljro  于 2023-01-12  发布在  Ruby
关注(0)|答案(2)|浏览(120)

我想一次创建多个记录,但是如果有任何记录由于验证错误而没有创建,那么它应该以某种方式处理该错误。

**参数 *

Parameters: {"group"=>[{"sort_by"=>"id", "template_ids"=>[182], "name"=>"Csdfwses", "count"=>1}, {"sort_by"=>"id", "template_ids"=>[181], "name"=>"rthydrt", "count"=>1}]}

因此,我的控制器的create方法如下所示:

def create
  @groups = Group.create group_params
   if @groups
    render json: { success: true, message: "#{@groups.length} groups created" }
   else
    render_422 @groups, 'Could not save groups.'
   end
end

我想处理的情况下,如果有任何错误发生,而创建任何记录,使创建后,它应该显示错误消息。
在上面的方法中,没有办法在这里使用error方法。如何显示错误消息?
我尝试使用begin-rescue

def create
  begin
   @groups = Group.create! group_params
    if @groups
     render json: { success: true, message: "#{@groups.length} groups created" }
    else
     render_422 @groups, 'Could not save groups.'
    end
  rescue ActiveRecord::RecordInvalid => invalid
    render json: { success: false, message: "#{invalid.record.errors.messages}" }, status: 500
  end
 end

但我在寻找更干净的方法,如果有的话?

6ovsh4lw

6ovsh4lw1#

您希望将一个散列数组传递给model.create,以便一次创建多个记录。

def create
  @groups = Group.create group_params
   if @groups.all? { |group| group.persisted? }
    render json: { success: true, message: "#{@groups.length} groups created" }
   else
    render_422 @groups, 'Could not save groups.'
   end
end

如果您想显示任何验证错误,那么您将需要查看model.errors,或者查看model.errors.full_messages中的错误数组。

def create
  @groups = Group.create group_params
   if @groups.all? { |group| group.persisted? }
    render json: { success: true, message: "#{@groups.length} groups created" }
   else
    errors = @groups.select(&:invalid?).map{ |g| g.errors.full_messages }.join("<br/>") 
    render_422 @groups, "Could not save groups. Here are the errors: #{errors}"
   end
end

您可能希望更好地格式化错误,但这只是一个简单的示例。

bvjxkvbb

bvjxkvbb2#

通常使用accepts_nested_attributes-但这需要某种层次关系:

class Company < ActiveRecord::Base
  has_many :employees
  accepts_nested_records_for :employees
  validates_associated :employees
end

class Employee < ActiveRecord::Base
  belongs_to :company
  validates_presence_of :name
end

c = Company.new(name: 'Acme', employee_attributes: [
  { name: 'Wile E. Coyotee' },
  { name: 'Bugs Bunny' },
  { name: nil } # invalid
])

c.valid? # false
c.save # false

那么,如果没有父模型,您将如何做到这一点呢?创建一个行为类似于父关联的模型:
x一个一个一个一个x一个一个二个x

相关问题