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