Высота сохраняется в базе данных в дюймах.
Однако ноги и дюймы нуждаются в собственных индивидуальных входах в форме:
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 %>
.
Я экспериментировал с пользовательскими компонентами, но я не могу получить два входа для отображения - и я не уверен, где лучше всего поставить логику "преобразования" с ног и дюймов в дюймы (и аналогично из дюймы назад до футов и дюймов).