【问题标题】:ActiveRecord RecordNotFound localizationActiveRecord RecordNotFound 本地化
【发布时间】:2013-11-01 12:39:55
【问题描述】:

我正在尝试本地化我的 Rails 应用程序(网络服务)。 我安装了 gem 'rails-i18n',效果很好。

除了它不翻译 ActiveRecord::RecordNotFound 消息。 在导轨代码中: https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/relation/finder_methods.rb

raise RecordNotFound, "Couldn't find #{@klass.name} with #{conditions.to_a.collect {|p| p.join(' = ')}.join(', ')}"

消息似乎是硬编码的。

除了不使用 Model.find_by_'attribute' 有什么解决办法吗?

【问题讨论】:

  • 注意:在 rails4 中,find_by_'attribute_name'!已弃用,因此该错误的发生率大大减少。

标签: ruby-on-rails activerecord internationalization rails-i18n


【解决方案1】:

足以让我告诉用户更多信息性消息:

exception.message.match /^Couldn't find (\w+) with (id=([\S]*))?/
msg = t 'activerecord.exceptions.not_found', klass: $1, id: $3

因为我想要捷克语翻译:

cs:
  activerecord:
    exceptions:
      not_found: "Nelze nalézt %{klass} s id=%{id}"

..什么时候是硬编码的,唯一的办法就是硬解码

【讨论】:

    【解决方案2】:

    您可以在应用程序控制器中捕获 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
    

    【讨论】:

    • 是的,但我会放弃显示 klass 和属性名称的原始消息的上下文关系!
    • 您需要这些信息做什么?恕我直言,对于用户来说,找不到什么是无关紧要的,而只是出了点问题。如果要记录此类错误,可以指定 not_found 接受参数异常。所以你可以访问它并记录它或其他任何东西......
    • 因为它是一个网络服务,客户必须知道他们做错了什么而不联系我们的支持。
    • 您可以使用 controller_name.classify.constantize.model_name.human 恢复类名 - 甚至是本地化的 - 并从 params 哈希中获取 ID 等内容。 Ondrej's solution 将在修改默认消息后立即中断。
    【解决方案3】:

    YAML 配置中的另一种方式:

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

    您也可以为型号名称设置复数形式,添加如下:

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

    【讨论】:

    • 还可以设置模型名的复数形式,添加如下:en:activerecord:models:user:one:Dude other:Dudes
    猜你喜欢
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多