ActiveRecord RecordNotFound本地化

时间:2013-10-23 09:46:04

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

我正在尝试本地化我的rails应用程序(webservice)。 我安装了gem'trail-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'?

3 个答案:

答案 0 :(得分:3)

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

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

..什么是硬编码的东西,唯一的方法是硬编码

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

YAML配置的另一种方式:

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

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

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