Rails radio_button重构最佳实践

时间:2013-09-26 00:42:50

标签: ruby-on-rails refactoring radio-button

我实际上在我的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一样写这个?

非常感谢

1 个答案:

答案 0 :(得分:1)

不知道这是否是铁路的方式,但它是一种有趣的方式并节省了一些线路。

这个想法是将对象的持续时间的索引与循环中的当前索引进行比较。如果@product.duration_type不在Product::DURATIONS或nil,则返回nilto_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