我正在保存一个对象:
@rentalrequest = RentalRequest.new do |rr|
rr.delivery_start = Time.zone.parse(request_params[:deliverydate] + " " + request_params[:deliverytime_start]).utc
...
end
每隔一段时间,我的前端验证就会失败,不知何故,即使deliverydate
和deliverytime_start
是空白的,表单也会发布。在这种情况下,控制器中断NoMethodError
,因为此语句没有意义: Time.zone.parse(")
但是,当这种情况发生时,我不必写救援,我觉得如果我能说rr.delivery_start = nil if Time.zone.parse doesn't work
,那就容易多了。这样,@rentalrequest对象的后端验证就会启动并起到救援作用。
但我不确定如何写rr.delivery_start = nil if Time.zone.parse doesn't work
(比如...如果它的任何部分不起作用)
思潮?
如何检查这些参数是否存在?
@rentalrequest = RentalRequest.new do |rr|
rr.delivery_start = nil
if request_params[:deliverydate].present? && request_params[:deliverytime_start].present?
rr.delivery_start = Time.zone.parse(request_params[:deliverydate] + " " + request_params[:deliverytime_start]).utc
end
...
end
你的计算在错误的地方,你的模型应该自己维护自己的状态。也许是这样的:
class RentalRequest < ActiveRecord::Base
before_validation :set_delivery_start
private
def set_delivery_start
# Presumably validations will catch these conditions...
return if(!deliverydate || !deliverytime_start)
self.delivery_start = ... # whatever calculation matches the deliverydate and delivertime_start types goes here
end
end
然后,您将进行验证,以确保所有三个交付值都有意义。
如果块在控制器中new
则可以require
这些参数。
def request_params
params
.require(:rental_request)
.permit(..., :deliverydate, :deliverytime_start)
.require(:deliverydate, :deliverytime_start)
end