创建新的order_preview时,我会将USPS称为送货选项。如果用户更新了他们的zip,我希望ship_option重置
编辑:我不再从视图中调用初始API调用,而是在控制器中执行after_create方法。
def get_ship_options
ship_options = {}
@order_preview.fedex_rates.each do |k, v|
if k.service_name == "FedEx Ground Home Delivery" || k.service_name == "FedEx 2 Day" || k.service_name == "FedEx Standard Overnight"
ship_options["#{k.service_name}"] = "#{number_to_currency(k.price.to_f / 100)}"
end
end
@order_preview.usps_rates.each do |k, v|
if k.service_name == "USPS Priority Mail 1-Day"
ship_options["#{k.service_name}"] = "#{number_to_currency(k.price.to_f / 100)}"
end
end
@order_preview.ship_option_hash = ship_options.map { |k,v| ["#{k} - #{v}","#{k} - #{v}" ] }
@order_preview.save
end
我尝试使用你们提供的答案,但是before_save实际上没有按照上面方法结尾处@ order_preview.save的方式保存shiphash。
我尝试使用相同的想法,但zip_changed?
在控制器中不起作用。
如何将从模型中提取的新哈希直接保存到@order_preview?
从我现在的模型
Model.rb
def clear_hash
if zip_changed?
get_shipping_rates
end
end
和
ship_options = {}
fedex_rates.each do |k, v|
if k.service_name == "FedEx Ground Home Delivery" || k.service_name == "FedEx 2 Day" || k.service_name == "FedEx Standard Overnight"
ship_options["#{k.service_name}"] = "#{number_to_currency(k.price.to_f / 100)}"
end
end
usps_rates.each do |k, v|
if k.service_name == "USPS Priority Mail 1-Day"
ship_options["#{k.service_name}"] = "#{number_to_currency(k.price.to_f / 100)}"
end
end
ship_option_hash = ship_options.map { |k,v| ["#{k} - #{v}","#{k} - #{v}" ] }
**save ship_option_hash to @order_preview.ship_option_hash**
答案 0 :(得分:1)
class OrderPreview
before_save :check_state
def check_state
if zip_changed?
ship_option_hash = nil
end
end
...
end
class OrderPreviewController
def update
@order_preview.update(order_preview_params)
end
...
end
答案 1 :(得分:0)
尝试将您的回调从after_save更改为before_save。记录被视为已更改,直到更改未持续存在。保存对象时更改会丢失,这就是检查after_save回调中的更改时记录未更改的原因。
它应该以这种方式工作:
before_save :clear_hash, if: :zip_changed?
def clear_hash
ship_option_hash = nil
end
这样可以保存更改,因为您使用的是before_save。在您的代码中,未保存更改,因为您使用了after_save回调
你是控制者:
def update
respond_to do |format|
if @order_preview.update(order_preview_params)
flash[:notice] = "Record was successfully updated"
else
flash[:alert] = "Record was not updated"
end
end
end