我实际上在我的Rails项目中使用表单助手radio_button
。当一切正常时,代码本身对我来说并不好看:
_form.html.haml
#- Loop on durations types
- Product::DURATIONS.each_with_index do |name, index|
#- If new record, then select the first index by default
- unless @product.duration_type.present?
- checked = (index == 0) ? true : false
- else
#- Otherwise, if edit, then select the product value
- checked = (name == @product.duration_type) ? true : false
= f.radio_button :duration_type, name, checked: checked
= f.label :duration_type, name
product.rb
DURATIONS = %w( Hour Day Week Month Year )
有没有更好的方法以更干的方式和Rails一样写这个?
非常感谢
答案 0 :(得分:1)
不知道这是否是铁路的方式,但它是一种有趣的方式并节省了一些线路。
这个想法是将对象的持续时间的索引与循环中的当前索引进行比较。如果@product.duration_type
不在Product::DURATIONS
或nil,则返回nil
,to_i
转换为整数,得到0或第一个单选按钮。
#- Loop on durations types
- Product::DURATIONS.each_with_index do |name, index|
- checked = Product::DURATIONS.index(@product.duration_type).to_i == index
= f.radio_button :duration_type, name, checked: checked
= f.label :duration_type, name
其他选项更具可读性。
#- Loop on durations types
- Product::DURATIONS.each_with_index do |name, index|
- checked = @product.duration_type ? (name == @product.duration_type) : (index == 0)
= f.radio_button :duration_type, name, checked: checked
= f.label :duration_type, name