从Model.rb保存到DB

时间:2014-06-16 19:48:45

标签: ruby-on-rails ruby ruby-on-rails-4

创建新的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**

2 个答案:

答案 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