将变量赋值为等式的输出,如果方程式无法运行,则为 nil(规避 NoMethodError)



我正在保存一个对象:

@rentalrequest = RentalRequest.new do |rr|
  rr.delivery_start = Time.zone.parse(request_params[:deliverydate] + " " + request_params[:deliverytime_start]).utc
  ...
end

每隔一段时间,我的前端验证就会失败,不知何故,即使deliverydatedeliverytime_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

相关内容