我會建議以下幾點。爲頭髮顏色創建一個字符串列。這通常是枚舉列(ENUM
),但Rails不支持這種方式,除非您在遷移中使用某些SQL。
在您的模型中,將顏色限制爲幾個有效值。
class User < ActiveRecord::Base
# Store the colours in the database as string identifiers (my preference
# would be English, lower case, with underscores). Only accept known values.
validates_inclusion_of :hair_colour, :in => %w{brown white red dark_brown}
end
然後,在config/locales/en.yml
:
en:
user:
hair_colours:
brown: brown
white: white
red: red
dark_brown: dark brown
而且在config/locales/de.yml
:
de:
user:
hair_colours:
brown: braun
white: weiss
red: rot
dark_brown: dunkelbraun
在任何視圖,你可以這樣做:
<%= t "user.hair_colours.#{@user.hair_colour}" %>
或者你可以寫一個01中的輔助方法:
def translated_hair_colour(user)
t "user.hair_colours.#{user.hair_colour}"
end
因爲我相信,翻譯是在原則上演示文稿的關注,我不會造成對User
模型的方法,但原則上沒有什麼阻止你這樣做的:
class User
# ...
def hair_colour_name
I18n.t "user.hair_colours.#{hair_colour}"
end
end
更新:
使選擇框在那些TRA視圖nslated可以通過兩種方式完成。 第一個選項將使用翻譯的值作爲源。這要求翻譯完整準確。如果並非所有值都被轉換,則缺失值將不會顯示在選擇框中。
<%= form_for @user do |user| %>
<%= user.select :hair_colour, t("user.hair_colours").invert %>
<%= user.submit %>
<% end %>
的第二個選項是從模型中使用的驗證值。這是「正確」的方式,但它需要對驗證設置進行微調。
class User < ActiveRecord::Base
HAIR_COLOURS = %w{brown white red dark_brown}
validates_inclusion_of :hair_colour, :in => HAIR_COLOURS
end
現在,在您的看法:
<%= form_for @user do |user| %>
<%= user.select :hair_colour,
User::HAIR_COLOURS.map { |c| [t("user.hair_colours.#{c}"), c] } %>
<%= user.submit %>
<% end %>
當然,映射可以很容易地提取到一個幫手。
嗯聽起來不錯..!謝謝!但是有沒有更聰明的解決方案?如果賞金沒有帶來更好的東西,將檢查這個答案...! – Lichtamberg 2010-09-04 21:57:42
您能告訴我如何使用此解決方案製作select_boxes嗎?如果你回答......請將你的答案標記爲接受。 – Lichtamberg 2010-09-07 20:46:42
@Lichtamberg:沒問題!答案已更新。 – molf 2010-09-08 06:56:30