2010-06-17 5 views
15

J'ai deux modèlesRails I18n accepts_nested_attributes_for et error_messages_for

class SurveyResponse 
    has_many :answers, :class_name => SurveyResponseAnswer.name 
    accepts_nested_attributes_for :answers 
end 

class SurveyResponseAnswer 
    belongs_to :survey_response 
    validates_presence_of :answer_text 
end 

Dans mon emboîtées si la validation échoue, je reçois cette erreur affiché à l'écran:

« Réponses réponse texte ne peut pas être vide "

J'ai personnalisé mes noms d'attributs avec succès en utilisant les rails I18n. Il ne se comporte pas exactement comment je m'attendrais bien. Le fichier YML ci-dessous n'affecte pas le nom d'attribut est imprimé dans error_messages_for

en: 
    activerecord: 
    models: 
     survey_response: 
     answers: "Response" 

Mais si à partir du script/console je tente
SurveyResponse.human_attribute_name (« réponses »)

-je obtenir le résultat attendu de "Réponse".

Ce que je voudrais faire est d'avoir le message d'erreur de validation dire:

« texte de réponse de réponse ne peut être vide ». Des idées sur ce que je dois réparer?

Répondre

13

Essayez ceci:.

en: 
    activerecord: 
    models: 
     survey_response: 
     answers: 
      answer_text: "Response" 

J'utilise Rails 3 et que cela fonctionne pour moi (mon fichier i18n est un peu différent, en utilisant « attributs » au lieu des modèles que je ne sais pas si cela fonctionne à 2,3)

en: 
    activerecord: 
    attributes: 
     survey_response: 
     answers: 
      answer_text: "Response" 

Avant que je cherchais à créer un attribut dans le YML appelé « answers_answer_text » mais il ne fonctionnait pas.

J'espère que cela résout votre problème.

+0

en 3.1 a bien fonctionné. Merci! –

+3

En fait, pas très bien: '[DEPRECATION WARNING] La recherche d'espace de noms I18n imbriquée sous "activerecord.attributes.survey_response" n'est plus supportée. Mais en passant par [cette discussion] (https://github.com/rails/rails/issues/1869), il ne semble pas encore y avoir une alternative non obsolète qui fonctionne. –

52

Comme Rails 3.2.0, le yaml i18n a changé à

en: 
    activerecord: 
    attributes: 
     survey_response: 
     foo: "Foo" 
     survey_response/answers: 
     answer_text: "Response" 

(Notez la barre oblique.) Cela vous permet également de définir un nom d'attribut sur la collection elle-même, par exemple

en: 
    activerecord: 
    attributes: 
     survey_response: 
     foo: "Foo" 
     answers: "Ripostes" 
     survey_response/answers: 
     answer_text: "Response" 

Source: https://github.com/rails/rails/pull/3859

+0

Merci beaucoup. Je peux confirmer que cela fonctionne pour moi dans Rails 3.2.8 où rien d'autre n'a fonctionné. M'a pris plus d'une heure de recherche! – brad

+2

Merci! il fonctionne avec des rails 4.0 :) –

+2

Cela fonctionne aussi sur Rails 4.1. Il devrait être accepté = P –

Questions connexes