Rails计算的值不适用于复选框

时间:2016-05-14 18:45:22

标签: ruby-on-rails ruby-on-rails-4 callback before-save

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

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 %>

1 个答案:

答案 0 :(得分:1)

使用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