Rails将表单中的两个字段映射到模型中的一个字段

时间:2014-12-18 10:15:35

标签: ruby-on-rails ruby forms

我正在使用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

1 个答案:

答案 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