将一个日期保存到两个日期时间列

时间:2015-08-12 12:42:18

标签: ruby-on-rails datetime ruby-on-rails-4

我的日程表模型中有两个日期时间列:starts_atends_at

要求:创建/更新计划时,用户将看到:

  • 1选择日期的选择菜单
  • 1选择菜单以选择开始时间(小时:分钟)
  • 1选择结束时间(小时:分钟)的选择菜单

我想让用户从单个选择菜单中选择日期。然后将日期保存在两个日期时间列中。我只希望日期相同,而不是时间。

我当前的代码使用户在日期时间属性上输入日期,这很麻烦:

<%= f.label :starts_at %>
<%= f.datetime_select :starts_at %>

<%= f.label :ends_at %>
<%= f.datetime_select :ends_at %>

我试过了:

# view
<%= f.date_select :starts_at, order: [:day, :month, :year] %>
<%= f.time_select :starts_at, ignore_date: true %>
<%= f.time_select :ends_at %>

# controller
def update
  @partner  = Partner.find(params[:partner_id])
  @schedule = @partner.schedules.find(params[:id])
  @klass    = Klass.find(schedule_params[:klass_id])
  @schedule.activity_id = @klass.activity_id

  date = Date.civil(schedule_params["starts_at(1i)"].to_i, schedule_params["starts_at(2i)"].to_i, schedule_params["starts_at(3i)"].to_i)
  @schedule.ends_at = date

  @schedule.update(schedule_params)
end

private

  def schedule_params
    params.require(:schedule).permit(:klass_id, :starts_at, :ends_at, :quantity)
  end

但它不起作用。

4 个答案:

答案 0 :(得分:0)

我认为你实际上错过了参数,因为它不在表单中。

该视图不应该是这样的吗?

<%= f.date_select :starts_at, order: [:day, :month, :year] %>
<%= f.time_select :starts_at, ignore_date: true %>
<%= f.date_select :ends_at, order: [:day, :month, :year] %>
<%= f.time_select :ends_at, ignore_date: true %>

答案 1 :(得分:0)

我无法发表评论,因为我没有足够的声望点,但不会做以下工作?

@schedule.ends_at = @schedule.starts_at

答案 2 :(得分:0)

我已经知道了。但代码非常难看。

def update
  @partner  = Partner.find(params[:partner_id])
  @schedule = @partner.schedules.find(params[:id])
  @klass    = Klass.find(schedule_params[:klass_id])

  @schedule.city_id     = @partner.city_id
  @schedule.activity_id = @klass.activity_id
  @schedule.klass_id    = schedule_params[:klass_id]
  @schedule.quantity    = schedule_params[:quantity]

  @schedule.starts_at = DateTime.civil(
    schedule_params["starts_at(1i)"].to_i, schedule_params["starts_at(2i)"].to_i,
    schedule_params["starts_at(3i)"].to_i,
    schedule_params["starts_at(4i)"].to_i, schedule_params["starts_at(5i)"].to_i
  )

  @schedule.ends_at = DateTime.civil(
    schedule_params["starts_at(1i)"].to_i, schedule_params["starts_at(2i)"].to_i,
    schedule_params["starts_at(3i)"].to_i,
    schedule_params["ends_at(4i)"].to_i, schedule_params["ends_at(5i)"].to_i
  )

  @schedule.save
end

private

def schedule_params
  params.require(:schedule).permit(:klass_id, :starts_at, :ends_at, :quantity)
end

我仍然向能够提出更好答案的任何人开放。

答案 3 :(得分:0)

您还可以尝试使用@schedule.starts_at上的the Rails DateTime change method来设置:ends_at值的时间。

像:

@schedule.ends_at = @schedule.starts_at.change(
  hour: schedule_params[:ends_at].hour, 
  min: schedule_params[:ends_at].min, 
  sec: 0
)

或类似的东西......