Rails 计算值不适用于复选框

Rails calculated value not working on checkboxes

预订模型中的额外费用列不会在创建新预订时计算和保存。它在编辑预订时计算并保存(即使不更改表单中的任何值)。似乎计算方法或其他方法未收到复选框值。

Reservation has_many :bookings, has_many :extras, :through => :bookings
Booking belongs_to :extra, belongs_to :reservation
Extra has_many :bookings, has_many :reservations, :through => :bookings

before_save :calculate_extras_cost

def calculate_extras_cost 
  self.extras_cost = self.extras.sum(:daily_rate) * total_days  
end

<%=hidden_field_tag "reservation[extra_ids][]", nil %> 
<%Extra.all.each do |extra|%>
  <%= check_box_tag "reservation[extra_ids][]", extra.id, @reservation.extra_ids.include?(extra.id), id: dom_id(extra)%>
<% end %>

使用 form collection helpers 而不是手动创建输入:

<%= form_for(@reservation) do |f| %>
  <%= f.collection_check_boxes(:extra_ids, Extra.all, :id, :name) %>
<% end %>

还要确保将 :extra_ids 属性.

列入白名单

使用回调时要记住的另一件事是父记录必须在子记录之前插入数据库!这意味着您不能在回调中使用 self.extras.sum(:daily_rate),因为它依赖于数据库中的子记录。

您可以使用 self.extras.map(&:daily_rate).sum 对 Ruby 中内存中关联模型的值求和。另一种选择是使用 association callbacks.