Ruby on rails 无法返回在模型上创建的错误
我正在使用gem,但无法显示我使用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
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
调用之前,您可以在控制台中调用它吗