Ruby on rails ActiveRecordNotFound本地化

Ruby on rails ActiveRecordNotFound本地化,ruby-on-rails,activerecord,internationalization,rails-i18n,Ruby On Rails,Activerecord,Internationalization,Rails I18n,我正在尝试本地化我的rails应用程序(webservice)。 我安装了gem'rails-i18n',运行良好 只是它不翻译ActiveRecord::RecordNotFound消息。 在rails代码中: 这条消息似乎是硬编码的 除了不使用模型之外,还有什么解决方案。通过“属性”查找?您可以在应用程序控制器中捕获RecordNotFound异常并返回本地化消息。通过这种方式,您还可以更改404的默认行为: class ApplicationController < ActionC

我正在尝试本地化我的rails应用程序(webservice)。 我安装了gem'rails-i18n',运行良好

只是它不翻译ActiveRecord::RecordNotFound消息。 在rails代码中:

这条消息似乎是硬编码的


除了不使用模型之外,还有什么解决方案。通过“属性”查找?

您可以在应用程序控制器中捕获RecordNotFound异常并返回本地化消息。通过这种方式,您还可以更改404的默认行为:

class ApplicationController < ActionController::Base

  rescue_from ActiveRecord::RecordNotFound, :with => :not_found

  private

    def not_found
      render :json => { :message => I18n.t('exception.record_not_found') },
             :status => :not_found
    end

end
class ApplicationController:找不到
私有的
未找到def
render:json=>{:message=>I18n.t('exception.record_not_found')},
:status=>:未找到
结束
结束

我有足够的理由告诉用户更多信息:

exception.message.match/^找不到id为([\S]*)的(\w+)吗/
msg=t'activerecord.exceptions.not_found',klass:$1,id:$3
既然我想要捷克的transaltion:

cs:
activerecord:
例外情况:
未找到:“Nelze nalézt%{klass}s id=%{id}”

…当某个东西是硬编码时,唯一的方法是在YAML config中以另一种方式对其进行硬反编码:

en:
 activerecord:
   exceptions:
     not_found: "%{model_name} not found"

还可以为模型名称设置复数形式,添加如下内容:

en:
  activerecord:
    models:
      user:
        one: Dude
        other: Dudes

是的,但是我将失去显示klass和属性名称的原始消息的上下文!你需要这些信息做什么?对于用户来说,没有发现什么是无关紧要的,只是出了问题。如果要记录此类错误,可以指定not_found接受参数异常。因此,您可以访问它并记录它或其他任何东西……因为它是一个Web服务,客户端必须知道他们做错了什么,而无需联系我们的支持。您可以使用
controller\u name.classify.constantize.model\u name.human
恢复类名,甚至是本地化的,并从
params
散列中获取ID等信息。将在修改默认消息后立即中断。注意:在rails4中,通过“属性\名称”查找\ u!已弃用,因此此错误的发生率大大降低。您还可以为模型名称设置复数形式,添加如下内容:en:activerecord:models:user:one:Dude其他:Dudes
en:
  activerecord:
    models:
      user:
        one: Dude
        other: Dudes