Ruby on rails Rails-无法更新datetime中的小时数
我有一个rails应用程序,其中“RFQ”具有datetime属性。日期在表单中更改,但我想将时间设置为始终为15:00 当我创建RFQ时,它可以正常工作,但如果我编辑它,它将更改为00:00:00 创建操作:Ruby on rails Rails-无法更新datetime中的小时数,ruby-on-rails,datetime,Ruby On Rails,Datetime,我有一个rails应用程序,其中“RFQ”具有datetime属性。日期在表单中更改,但我想将时间设置为始终为15:00 当我创建RFQ时,它可以正常工作,但如果我编辑它,它将更改为00:00:00 创建操作: def create @rfq = Rfq.new(rfq_params) @rfq.owner = current_user.email @rfq.due = @rfq.due.change(hour: 15) respond_to do |forma
def create
@rfq = Rfq.new(rfq_params)
@rfq.owner = current_user.email
@rfq.due = @rfq.due.change(hour: 15)
respond_to do |format|
if @rfq.save
format.html { redirect_to @rfq, notice: 'Rfq was successfully created.' }
format.json { render :show, status: :created, location: @rfq }
else
format.html { render :new }
format.json { render json: @rfq.errors, status: :unprocessable_entity }
end
end
end
更新操作
def update
@rfq.owner = current_user.email
@rfq.due = @rfq.due.change(hour: 15)
respond_to do |format|
if @rfq.update(rfq_params)
format.html { redirect_to @rfq, notice: 'Rfq was successfully updated.' }
format.json { render :show, status: :ok, location: @rfq }
else
format.html { render :edit }
format.json { render json: @rfq.errors, status: :unprocessable_entity }
end
end
end
创建后:
Rfq Load (0.2ms) SELECT "rfqs".* FROM "rfqs" ORDER BY "rfqs"."id" DESC LIMIT 1
=> Wed, 01 Jul 2015 15:00:00 CDT -05:00
在我编辑之后
Rfq Load (0.2ms) SELECT "rfqs".* FROM "rfqs" ORDER BY "rfqs"."id" DESC LIMIT 1
=> Tue, 30 Jun 2015 00:00:00 CDT -05:00
您的问题是,在使用表单中的值更新属性之前,您正在更改属性
due
属性
您应该这样做:
def update
@rfq.owner = current_user.email
@rfq.attributes = rfq_params
@rfq.due = @rfq.due.change(hour: 15)
respond_to do |format|
if @rfq.save
format.html { redirect_to @rfq, notice: 'Rfq was successfully updated.' }
format.json { render :show, status: :ok, location: @rfq }
else
format.html { render :edit }
format.json { render json: @rfq.errors, status: :unprocessable_entity }
end
end
end
它可以工作,但为什么我必须将@rfq.update(rfq_参数)更改为if@rfq.save?为什么不总是使用.save而不是.update?主要区别在于,我们从第一个开始分配值,然后更改到期日期,然后保存
update
相当于从表单中分配参数并立即保存,这将覆盖之前设置的几行due
。