从Rails控制器中的私有方法返回错误

时间:2020-07-27 17:46:36

标签: ruby-on-rails ruby controller

以下是控制器中的更新操作。我在这里面临的问题是,如果agency_information私有方法中存在错误,则无法将错误添加到@ agency.errors中。我要防止@ agency.save动作是@ agency.errors中的错误并呈现json:{错误:@ agency.errors.full_messages},状态::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

3 个答案:

答案 0 :(得分:1)

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

检查here以获得更多详细信息。

full_messages只是吸气剂。向其中添加错误不会做任何事情。

请注意,如果您致电@agency.save,将重新运行验证并清除现有错误。您需要将验证添加到模型级别,或者在调用.save之前手动检查错误。

答案 1 :(得分:1)

您无法将错误添加到@agency这样的模型对象中,如下所示

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

相反,请遵循

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

答案 2 :(得分:0)

如果您想保存@agency,并且每当遇到错误时都想返回该错误,在这种情况下,您可以执行以下操作,

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
相关问题