2010-06-17 18 views
15

Ho due modelliRails I18n accepts_nested_attributes_for e 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 

Nel mio formato nidificato se la convalida non riesce ottengo questo errore visualizzato sullo schermo:

"risposte risposta di testo non può essere vuoto "

Ho personalizzato i nomi degli attributi in qualche modo utilizzando correttamente i rail I18n. Non si comporta esattamente come mi aspetterei comunque. Il file yml di seguito non influisce come il nome dell'attributo viene stampato in error_messages_for

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

Ma se da script/console provo
SurveyResponse.human_attribute_name ("risposte")

ottengo il risultato atteso di "Risposta".

Quello che mi piacerebbe fare è avere il messaggio di errore di convalida dicono:

"testo della risposta di risposta non può essere vuoto". Qualche idea su cosa devo riparare?

risposta

13

Prova questo:.

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

Sto usando Rails 3 e questo sta lavorando per me (il mio file i18n è un po 'diverso, l'utilizzo di "attributi", invece di modelli non so se questo funziona a 2,3)

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

Prima che stavo cercando di creare un attributo nel yml chiamato "answers_answer_text", ma non funzionava.

Spero che questo risolva il problema.

+0

ha funzionato bene in 3.1. Grazie! –

+3

In realtà, non così bene: '[AVVISO DI AVVISO] La ricerca di spazi dei nomi I18n annidati sotto "activerecord.attributes.survey_response" non è più supportata'. Ma passando [a questa discussione] (https://github.com/rails/rails/issues/1869), sembra che non ci sia ancora un'alternativa non completamente deprecata. –

52

Come di Rails 3.2.0, il yaml i18n è cambiato per

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

(Si noti la barra.) Ciò consente inoltre di definire un nome di attributo sulla raccolta in sé, per esempio

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

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

+0

Grazie mille. Posso confermare che questo funziona per me in Rails 3.2.8 dove nient'altro ha fatto. Ci ho messo oltre un'ora di ricerca! – brad

+2

Grazie! funziona con binari 4.0 :) –

+2

Funziona anche su Rails 4.1. Dovrebbe essere accettato = P –