我正在使用Rails 4.2rc3和simple_form
gem。
我有一个Event
模型,其中有一个字段reservations_open_at
,表示事件开始前几秒钟可以开始预订(例如预订可能提前2天打开,或者可能提前10小时)。
但是,我想使用带有文字输入的表单来表示数字(reservations_open_at_amount
)和选择表单以用于'时间'或者' Days' (reservations_open_at_unit
)。即用户可以输入2天'或者' 10小时'通过这两个领域。
我无法通过我的控制器中的常规reservations_open_at
调用找出使用虚拟属性在几秒钟内设置@event.update(event_params)
字段的正确方法。
我不需要记住用户在编辑现有记录时是选择小时还是天数;如果reservations_open_at
量模(24 * 60 * 60)为零(即秒数是天数的精确倍数),那么我将显示包含reservations_open_at / (24*60*60)
和Days
的表格,其他reservations_open_at / (60*60)
和Hours
。
答案 0 :(得分:0)
你已经超过一半了。
在模型中,添加两个虚拟属性,time_amount,time_units。将这两个添加到视图中。 添加before_save回调以设置reservations_open_at中的值。
类似的东西:
编辑为时间单位添加getter
class Event < ActiveRecord::Base
attr_accessor :time_unit, time_amount
before_save :calculate_open_at
...
def time_unit
return @time_unit if @time_unit
if ( self.time_amount = reservations_open_at / 1.day.seconds ) > 0
@time_unit = 'days'
else
self.time_amount = reservations_open_at / 1.hour.seconds
@time_unit = 'hours'
end
end
def calculate_open_at
conversion_rate = time_unit == "days" ? 1.day.seconds : 1.hour.seconds
self.reservations_open_at = time_amount * conversion_rate
end
...
end