Return 来自 rails 控制器中私有方法的错误

Return error from a private method in rails controller

下面是控制器中的更新动作。我在这里面临的问题是,如果 agency_information 私有方法中存在错误,我无法将错误添加到 @agency.errors 中。我想阻止 @agency.save 操作是在 @agency.errors 和渲染 json 中有错误:{ errors: @agency.errors.full_messages }, status : :unprocessable_entity。请帮我解决这个问题。

class AgenciesController < MyAccountController
 def update      
    @agency_params = agency_params
    @agency = current_agency
    agency_information
    render json: { errors: @agency.errors.full_messages }, status: :unprocessable_entity unless @agency.save
 end

 private
 def agency_information
  @agency = current_agency
  gateway = ChargeIO::Gateway.new(secret_key: Settings.lawpay.secret_key)
  card = gateway.create_card(token_id: params[:id])
  if card.messages.empty?
    @agency_params[:card][:number] = gateway_card.number
  else
    @agency.errors.full_messages << card.messages.collect(&:message).join("\n")
  end
 end
end

如果要向模型添加错误,应使用 .errors.add(:base, message)。如果错误与特定属性有关,则 :base 可以是您的任何模型属性;如果错误与一般模型有关,则 :base 可以是您的任何模型属性。

查看 here 了解更多详情。

full_messages 只是一个 getter。向那里添加错误没有任何作用。

请注意,如果您调用 @agency.save,将重新运行验证并清除现有错误。您需要将该验证添加到模型级别或在调用 .save.

之前手动检查错误

如果您想保存您的@agency 并且每当您遇到错误时您想要 return 那,在这种情况下您可以这样做,

def update
@agency.save!
render json: {"result": {"data": {@agency}}
rescue StandardError => e
  render json: {"error": 
 {"status":500,"message":@agency.errors.full_messages.merge}}, status: 500
end

使用以下代码将错误添加到模型对象将不起作用

@agency.errors.full_messages << card.messages.collect(&:message).join("\n")

改为执行以下操作

error_message = card.messages.collect(&:message).join("\n")
@agency.errors.add(:card, error_message)