1

我实际上radio_button在我的 Rails 项目中使用了表单助手。当一切正常时,代码本身对我来说并不好看:

_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

产品.rb

DURATIONS = %w( Hour Day Week Month Year )

有没有更好的方法以更 DRY 和 Rails 的方式编写它?

非常感谢

4

1 回答 1

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
于 2013-09-26T01:22:45.350 回答