代码之家  ›  专栏  ›  技术社区  ›  cyrilchampier

ActiveRecord RecordNotFound本地化

  •  4
  • cyrilchampier  · 技术社区  · 11 年前

    我正在尝试本地化我的rails应用程序(Web服务)。 我安装了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'之外,还有什么解决方案吗?

    3 回复  |  直到 11 年前
        1
  •  5
  •   Ondřej Želazko    11 年前

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

    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
  •  2
  •   Vishnu Atrai    9 年前

    YAML配置中的另一种方式:

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

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

    en:
      activerecord:
        models:
          user:
            one: Dude
            other: Dudes
    
        3
  •  1
  •   lawitschka    11 年前

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