4

我正在尝试本地化我的 rails 应用程序(webservice)。我安装了 gem 'rails-i18n',它工作正常。

除了它不翻译 ActiveRecord::RecordNotFound 消息。在 Rails 代码中: 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' 之外,有什么解决方案吗?

4

3 回答 3

4

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

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}"

..什么时候是硬编码的唯一方法是硬解码它

于 2013-12-30T09:24:02.770 回答
1

您可以在应用程序控制器中捕获 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
于 2013-10-23T09:58:29.227 回答
1

YAML 配置中的另一种方式:

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

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

en:
  activerecord:
    models:
      user:
        one: Dude
        other: Dudes
于 2015-07-27T12:09:56.630 回答