我的日程表模型中有两个日期时间列:starts_at
和ends_at
。
要求:创建/更新计划时,用户将看到:
我想让用户从单个选择菜单中选择日期。然后将日期保存在两个日期时间列中。我只希望日期相同,而不是时间。
我当前的代码使用户在日期时间属性上输入日期,这很麻烦:
<%= 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
但它不起作用。
答案 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
)
或类似的东西......