高度以英寸为单位存储在数据库中。
然而,英尺和英寸需要它们自己的单独输入,格式为:
Height: [_______] feet [_______] inches
所以我使用了虚拟属性,并让它工作。这是我的模型的简化版本:
class Client < ActiveRecord::Base
attr_accessible :name, :height_feet, :height_inches
before_save :combine_height
def height_feet
height.floor/12 if height
end
def height_feet=(feet)
@feet = feet
end
def height_inches
if height && height%12 != 0
height%12
end
end
def height_inches=(inches) #on save?
@inches = inches
end
def combine_height
self.height = @feet.to_d*12 + @inches.to_d #if @feet.present?
end
end
_form
部分使用 simple_form :
<%= simple_form_for(@client) do |f| %>
<ul>
<%= f.error_notification %>
<%= f.input :name %>
<%= f.input :weight %>
<li>
<%= f.input :height_feet, :label => 'Height', :wrapper => false %>
<span>feet</span>
<%= f.input :height_inches, :label => false, :wrapper => false %>
<span>inches</span>
</li>
<%= f.error :base %>
</ul>
<%= f.button :submit %>
<% end %>
这行得通。不过这是不理想的。
我想把它干掉并创建一个自定义输入组件,这样我就可以为表单添加高度<%= f.input :height, as: :feet_and_inch %>
- 因此任何其他遵循相同模式的输入,例如<%= f.input :wingspan, as: :feet_and_inch %>
.
我已经尝试过自定义组件,但我无法显示两个输入 - 而且我不确定将“转换”逻辑从英尺和英寸转换为英寸(同样从英寸返回到英尺和英寸)。