Ajax根据嵌套表单Cocoon Rails更改父表单的字段

时间:2014-06-24 16:47:56

标签: jquery ruby-on-rails ajax cocoon-gem

对于乱糟糟的标题感到抱歉,但我甚至不知道如何正确解释我的问题..

我有一个带有预订表单的rails应用程序,其中包含一个字段“total_price”。 表单可以添加/删除客房  茧宝石    https://github.com/nathanvda/cocoon(ajax)房间模型有一个字段“价格”。

如何根据房间数量和选择的类型更新字段total_price?

保留/ new_html.erb

   <%= simple_form_for @reservation do |f| %>
   <%= f.error_notification %>
<fieldset>
  <%= f.input :date_from, as: :string, input_html: { class: 'date', id: 'checkin',  :placeholder   => 'From' }, :label => false %>

  <%= f.input :date_to, as: :string, input_html: { class: 'date', id: 'checkout', :label => false %>

  <div id="rooms">
    <%= f.fields_for :entries do |entry| %>
        <%= render 'entry_fields', :f => entry %>
    <% end %>

    <%=  link_to_add_association 'add room', f, :entries %>
  </div>

  <%= f.input :total_price, :label => false %>
</fieldset>

<%= f.button :submit %>
<% end %>

保留/ _entry_fields.html.erb

<div class="nested-fields">
  <div class="field">
    <%= f.association :rooms, input_html: { class: 'room-select' },  :label => false %>
    <%= f.number_field :number_of_rooms, input_html: { class: 'room-count' }, :label => false %>
    <%=  link_to_remove_association "Remove room", f %>
  </div>
</div>

ReservationsController

class ReservationsController < ApplicationController
    def new
        @reservation = Reservation.new
    end
    def create
     @reservation = Reservation.new(reservation_params)
     if @reservation.save

      redirect_to root_path, :notice => "Booking Confirmed"
    else
      render "new"
    end
  end

  private
    def reservation_params
    params.require(:reservation).permit(:date_to, :date_from,  entries_attributes: [ :reservation_id, :number_of_rooms, :_destroy, :room_ids => []])
  end
end

我的apps / assets / javascript / application.js是空的,除了包括jquery和cocoon

Cocoon确实支持回调,但我非常有限的JS知识无法提供解决方案。

任何指导都会受到很大关注, 谢谢你的时间

1 个答案:

答案 0 :(得分:0)

好吧,当您添加新房间时,总价格不会改变,当您选择房间或房间数时它会改变(我假设选择房间实际上选择了一个类型)。

所以你可以使用简单的jquery。

当您动态移除房间时,总价格会发生变化,您应该使用cocoon:after_remove回调。

回顾:

  • .room-select.room-count收到change事件时 - >重新计算总价
  • 触发cocoon:after-remove事件时 - &gt;重新计算总价