如何在ActiveRecordError上使用rails-i18n与关联?

时间:2011-11-30 13:07:52

标签: ruby-on-rails ruby-on-rails-3 localization

我正在尝试翻译https://github.com/lifo/docrails/blob/master/activerecord/lib/active_record/associations.rb

在我的控制器文件中,我有:

@book = Book.find(params[:id])

begin
  @book.destroy
rescue ActiveRecord::DeleteRestrictionError => e
  flash[:error]= e.message # <<< Translate this message ?
end

这是我使用的翻译文件:https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/th.rb

如何为translate "#{e.message}"编写代码?

2 个答案:

答案 0 :(得分:1)

您可以在en.yml文件

中使用此功能
activerecord:
   book:
    error: 'book error: %{e}'

你可以用这个

来拯救你的救援区
flash[:error] = t("book.error") % {:e => e.message}

这适用于案例

答案 1 :(得分:0)

我曾经遇到过同样的问题。

所以有两种解决方案;


a。您可以通过手动指定“代码”来自己翻译已翻译的错误

@book = Book.find(params[:id])

begin
  @book.destroy
rescue ActiveRecord::DeleteRestrictionError => e
  flash[:error]= I18n.t('en.activerecord.errors.messages.restrict_dependent_destroy')
end

b。或者,您可以使用仍在使用的宝石rails-i18n

首先,您需要配置book模型:

has_many :children, dependent: :restrict_with_error

那你就可以做

@book = Book.find(params[:id])

if @book.destroy
  # show success message
else
  flash[:error] = resource.errors.messages[:base].join(', ')
  # should include the translated error message if you are using rails-i18n
end

我假设您使用的是:restrict_with_exception而不是:restrict_with_error,只是为了以防万一。