Rails 5 - 从嵌套模型

时间:2017-02-11 00:21:06

标签: ruby-on-rails

PT-BR.yml

pt-BR:
  activerecord:
    models:
      user: Usuário
      project: Projeto
    attributes:
      user:
        name: O nome
        description: A descrição
        projects: Os projetos
      project:
        name: O nome
  errors:
    format: "%{attribute} %{message}"
    messages:
      accepted: deve ser aceito
      blank: não pode ficar em branco
      ........

型号:

class User < ApplicationRecord
  has_many :projects, dependent: :destroy, inverse_of: :user

  accepts_nested_attributes_for :projects, allow_destroy: true
end

class Project < ApplicationRecord
  belongs_to :user, inverse_of: :projects

  validates :name, presence: true, length: { mininum: 3, maximum: 255 }
end

控制器:

def update
  if @user.update(user_params)
    render json: @user
  else
    render json: { errors: @user.errors.full_messages }, status: :unprocessable_entity
  end
end

调用方法.error.full_messages时正在翻译所有错误消息,除了那些来自 projects 对象的消息(正如您上面提到的那样,我正在使用{{1 }})。

我总是收到以下错误消息:

accepts_nested_attributes_for

如何在翻译文件中翻译项目名称,甚至从错误消息中删除“投影%atribute%”(没有任何黑客)?

2 个答案:

答案 0 :(得分:1)

对于Rails 5.2,我不得不检查核心代码以发现它在嵌套属性的翻译中使用了名称空间,例如:

  pt-BR:
    activerecord:
      attributes:
        user/projects:
          name: O nome de um projeto

因此,在“用户/项目”节点内,您可以在其中列出嵌套在用户中的项目的属性。

答案 1 :(得分:0)

如果您看到文档:http://guides.rubyonrails.org/i18n.html#error-message-scopes

请注意,错误名称空间与常规模型文本不同,您应该尝试在错误名称空间下添加模型和属性以匹配 activerecord.errors.models.[model_name].attributes.[attribute_name]

pt-BR:
  activerecord:
    models:
      user: Usuário
      project: Projeto
    attributes:
      user:
        name: O nome
        description: A descrição
        projects: Os projetos
      project:
        name: O nome
  errors:
    format: "%{attribute} %{message}"
    models:
      user: Usuário
      project: Projeto
    attributes:
      user:
        name: O nome
        description: A descrição
        projects: Os projetos
      project:
        name: O nome
    messages:
      accepted: deve ser aceito
      blank: não pode ficar em branco