2012-08-14 98 views
3

考慮這個設置序列化屬性:的Rails的I18n使用fields_for

#app/models/user.rb 
class User > ActiveRecord::Base 
    attr_accessible :login, :options 
    serialize :options, OpenStruct 
end 

#app/views/users/_form.html.erb 
form_for @user do |f| 
    f.label :login 
    f.fields_for :options, @user.options do |options| 
    options.label :emailme 
    end 
end 

#config/locals/en.yml 
    en: 
    activerecord: 
     attributes: 
     user: 
      login: "User Name" 
      options: 
      emailme: "Email Preference" 

我試圖解決的是能夠本地化標籤標記爲屬性的問題(:emailme)序列化屬性「選項」。

我深入研究了rails的源代碼,發現問題是因爲當我調用options.label期望有一個對象,但是沒有對象,因爲傳遞的對象名是「用戶[選項]],這不是有效的實例變量名稱。

請參閱line 1124 of form_helper.rb on rails github它檢索對象。有一個評論,甚至提到當object_name是item [subobject]時回退到nil。

所以,當它來創建實際的標籤Line 1110 form_helper.rb則默認爲method_name.humanize

是否有實現與序列化的屬性定位任何體面的方式?

回答

0

我想你想創建自己的密鑰並顯式調用I18n.translate?

看到http://guides.rubyonrails.org/i18n.html

# config/locals/en.yml 
en: 
    users: 
    email_preference: "Email Preference" 

# app/views/users/_form.html.erb 
form_for @user do |f| 
    f.label :login 
    f.fields_for :options, @user.options do |options| 
    options.label :emailme, I18n.translate('users.email_preference') 
    end 
end 

警告:未經測試的代碼

也可能工作使用您現有的配置? I18n.translate('activerecord.attributes.user.options.emailme')

你也可以「範圍」你在當地人的密鑰文件到行動和控制器

+0

這的確會的工作,但我一直在尋找更多的是基於框架的解決方案。當框架行爲不一致時,它總是讓我感到厭煩,尤其是在rails上的ruby,因爲它的靈活性和可擴展性非常可笑。在屬性範圍中指定它的好處是,驗證錯誤消息將獲得此翻譯。所以爲了讓你的解決方案完全正確地工作,我必須在兩個地方指定基本相同的東西......不是很d.r.y. – 2012-08-14 09:07:14

4

另外,我發現我可以用國際化的助手像這樣(而不是在形式改變任何東西):

en: 
    helpers: 
    label: 
    "user[options]": 
     emailme: "Email Preference" 

雖然這還不包括驗證消息...