Ruby on rails 无法返回在模型上创建的错误

Ruby on rails 无法返回在模型上创建的错误,ruby-on-rails,ruby,responders,Ruby On Rails,Ruby,Responders,我正在使用gem,但无法显示我使用erros.add(:base,'Error message')在模型上创建的错误 在我的控制器上,在用@app响应\u之前,我调试了@app对象,它有错误@app.errors。任何?返回真 在我看来,当我检查flash和@app对象时,没有一个对象出现错误 应用程序控制器 # app_controllers.rb def destroy @app = current_company.apps.find(params[:id]) @app.destro

我正在使用gem,但无法显示我使用
erros.add(:base,'Error message')
在模型上创建的错误

在我的控制器上,在
用@app
响应\u之前,我调试了
@app
对象,它
错误
@app.errors。任何?
返回

在我看来,当我检查
flash
@app
对象时,没有一个对象出现错误

应用程序控制器

# app_controllers.rb
def destroy
  @app = current_company.apps.find(params[:id])
  @app.destroy
  respond_with @app
end
应用程序模型

# app.rb

before_destroy :destroy_on_riak

# ...

def destroy_on_riak
  # SOME CODE HERE
rescue Exception => e
  errors.add(:base, I18n.t("models.app.could_not_destroy", :message => e.message))
  return false
end
应用程序视图

# apps.html.haml
-flash.each do |name, msg|
  %div{:class => "flash #{name}"}
    =content_tag :p, msg if msg.is_a?(String)
这是
@app.destroy

"#<ActiveModel::Errors:0x00000004fa0510 @base=#<App id: 34, ...>, @messages={}>"
"#<ActiveModel::Errors:0x00000004fa0510 @base=#<App id: 34, ...>, @messages={:base=>[\"Não foi possível excluir a aplicação: undefined method `get_or_new' for #<App:0x00000004f824c0>\"]}>"

为了简单起见,我删除了
@base=
中的内容。

谜团似乎是(a)您可能调用的方法不正确,或者(b)
。错误
哈希不包含您认为它包含的内容

错误的方法? 在控制器中,您正在调用
@app.destroy
,但添加错误的方法称为
destroy\u on\u riak

你确定你不想打这个吗

# app_controllers.rb
def destroy
  @app = current_company.apps.find(params[:id])
  @app.destroy_on_riak    # <= The offending line?
  respond_with @app
end
#app#u controllers.rb
def销毁
@app=当前公司.apps.find(参数[:id])

@app.destroy_on_riak#谜团似乎是(a)您可能调用的方法不正确,或者(b)
.errors
哈希不包含您认为它包含的内容

错误的方法? 在控制器中,您正在调用
@app.destroy
,但添加错误的方法称为
destroy\u on\u riak

你确定你不想打这个吗

# app_controllers.rb
def destroy
  @app = current_company.apps.find(params[:id])
  @app.destroy_on_riak    # <= The offending line?
  respond_with @app
end
#app#u controllers.rb
def销毁
@app=当前公司.apps.find(参数[:id])

@app.destroy_on_riak我会给你一些提示:

提示1

您的表单可能正在调用
@app
对象上的
valid?
valid?
方法清除实例上的
errors
数组

在验证上下文之外使用
errors
数组/构造是不正确的。但这是MHO

提示2

根据respondersgem(我过去从未使用过),您的区域设置只需要具有正确的配置。例如:

flash:
  actions:
    create:
      notice: "{resource_name} was successfully created"
    update:
      notice: "{resource_name} was successfully updated"
    destroy:
      notice: "{resource_name} was successfully destroyed"
      alert: "{resource_name} could not be destroyed"

是吗?

我会给你一些提示:

提示1

您的表单可能正在调用
@app
对象上的
valid?
valid?
方法清除实例上的
errors
数组

在验证上下文之外使用
errors
数组/构造是不正确的。但这是MHO

提示2

根据respondersgem(我过去从未使用过),您的区域设置只需要具有正确的配置。例如:

flash:
  actions:
    create:
      notice: "{resource_name} was successfully created"
    update:
      notice: "{resource_name} was successfully updated"
    destroy:
      notice: "{resource_name} was successfully destroyed"
      alert: "{resource_name} could not be destroyed"

是吗?

我必须同意@p.mastinopoulos的意见。这应该通过内置验证来处理。听起来您需要构建一个自定义验证器

在销毁之前,请尝试将您的
替换为
验证

validate :destroy_on_riak, on: :destroy

尚未尝试过,但是如果它不起作用,您可能需要考虑在文档中引用的自定义验证器。

,我必须同意@ p.Mistin PoopLOS。这应该通过内置验证来处理。听起来您需要构建一个自定义验证器

在销毁之前,请尝试将您的
替换为
验证

validate :destroy_on_riak, on: :destroy

尚未尝试过,但如果它不起作用,您可能需要考虑在文档中引用自定义创建验证器。

jffLunt是正确的,当调用<代码>有效> <代码>时,清除错误数组:参阅

验证程序的设计目的是100%确定对象的有效性,而不是在您自己添加错误供以后使用时

虽然ActiveRecord确实覆盖了
#valid?
,但它仍然调用
super

如果要添加错误并使其持续,我建议如下:

def failures
  @failures ||= []
end

validate :copy_failures_to_errors

def copy_failures_to_errors
  @failures.each { |f| errors.add(*f) }
end
然后修改您的
救援

def destroy_on_riak
  # SOME CODE HERE
rescue Exception => e
  failures.push([:base, I18n.t("models.app.could_not_destroy", :message => e.message)])
  return false
end
我知道这似乎令人费解,我知道甚至有人在网上使用或推荐
错误的例子。添加(:base…)
,但这不是一种安全的方式来存储和检索错误供以后使用



另外,这只是一个建议,但我建议您拯救
标准错误
,而不是
异常
,除非您必须这样做。内存不足错误和诸如此类的错误都是异常,但是您想要挽救的每个正常错误都应该继承自
StandardError
。仅供参考。

jefflunt是正确的,当调用
\valid?
时,它会清除错误数组:请参阅

验证程序的设计目的是100%确定对象的有效性,而不是在您自己添加错误供以后使用时

虽然ActiveRecord确实覆盖了
#valid?
,但它仍然调用
super

如果要添加错误并使其持续,我建议如下:

def failures
  @failures ||= []
end

validate :copy_failures_to_errors

def copy_failures_to_errors
  @failures.each { |f| errors.add(*f) }
end
然后修改您的
救援

def destroy_on_riak
  # SOME CODE HERE
rescue Exception => e
  failures.push([:base, I18n.t("models.app.could_not_destroy", :message => e.message)])
  return false
end
我知道这似乎令人费解,我知道甚至有人在网上使用或推荐
错误的例子。添加(:base…)
,但这不是一种安全的方式来存储和检索错误供以后使用



另外,这只是一个建议,但我建议您拯救
标准错误
,而不是
异常
,除非您必须这样做。内存不足错误和诸如此类的错误都是异常,但是您想要挽救的每个正常错误都应该继承自
StandardError
。仅供参考。

谢谢您的回答。如您所想,riak上的
destroy\u
在destroy
之前的
上被调用(我用这个重要的细节更新了这个问题)。
@app.errors.any?
当我在
@app.destroy
之后放置
调试器时返回true,它在控制器和视图之间丢失。如果将
调试器
行移动到
@app.destroy
调用之前,您可以在控制台中调用它吗