0

複数のソースからデータを取得して、フォームにいくつかのデフォルトをインテリジェントに事前入力するフォームがあります。「visit_type」ドロップダウンが選択されたときに編集可能な「visit_price」テキスト ボックスも事前入力したいと思います。このドロップダウンは、名前検索フィールドによって jquery を介して ajdusted される grouped_collection_select です (これこのrailscast ビデオに従って)

以下は、これまでのフォーム ビュー、モデルの関連付け、および coffeescript です。関連するhtml出力も含めました。

編集: 明確にするために、ドロップダウンから選択されたクライアント価格に関連付けられている価格を取得する方法がわかりません。

訪問 ブロック フォーム 表示

<%= form_for(@visit_block) do |f| %>

  <div class="controls controls-row">
    <div class="form-inputs">
      <%= f.text_field :client_name, data: {autocomplete_source: current_user.clients.order(:last_name).map(&:last_name)} %>
    </div>
    <div class="form-inputs">
      <%= f.grouped_collection_select :visit_type, current_user.clients.order(:last_name), :client_prices, :last_name, :visit_type, :visit_type,  include_blank: true %>
      <%= f.text_field :visit_price %>
    </div>
    </div>
  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

モデル

class VisitBlock < ActiveRecord::Base
  attr_accessible :visit_price, :visit_type, :client_id

  belongs_to :client

  def client_name
    client.try(:last_name)
  end

  def client_name=(last_name)
    self.client = Client.find_by_last_name(last_name) if last_name.present?
  end

end


class Client < ActiveRecord::Base
  attr_accessible :active, :address_1, :address_2, :city, :email, :first_name, :last_name, :state, :user_id, :zip, :client_prices_attributes
  has_many :client_prices, :dependent => :destroy

end

class ClientPrice < ActiveRecord::Base
  attr_accessible :client_id, :price, :visit_type, :id, :default_price_id, :custom, :_destroy

  belongs_to :client
  belongs_to :default_price


end

Coffeescript (これまで)

jQuery ->
  $('#visit_block_client_name').autocomplete
    source: $('#visit_block_client_name').data('autocomplete-source')

  visit_types = $("#visit_block_visit_type").html()
  console.log visit_types
  $("#visit_block_client_name").keyup ->
    client_name = visit_block_client_name.value
    options = $(visit_types).filter("optgroup[label=" + client_name + "]").html()
    console.log options
    if options
      $("#visit_block_visit_type").html options
    else
      $("#visit_block_visit_type").empty()

  $("#ui-id-1").click ->
    client_name = visit_block_client_name.value
    options = $(visit_types).filter("optgroup[label=" + client_name + "]").html()
    console.log options
    if options
      $("#visit_block_visit_type").html options
    else
      $("#visit_block_visit_type").empty()

HTML 出力 (これまで)

              <h1>New visit_block</h1>

<form accept-charset="UTF-8" action="/visit_blocks" class="new_visit_block" id="new_visit_block" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="I4xbbvdswv18TtP4LWoZHo7udmABT0J/nvKEPLFfO5Q=" /></div>

  <div class="controls controls-row">
    <div class="form-inputs">
      <input data-autocomplete-source="[&quot;Client1&quot;,&quot;Client2&quot;,&quot;Client3&quot;]" id="visit_block_client_name" name="visit_block[client_name]" size="30" type="text" />
    </div>
    <div class="form-inputs">
      <select id="visit_block_visit_type" name="visit_block[visit_type]"><option value=""></option>
<optgroup label="Client1">
<option value="morning">morning</option>
<option value="Morning weekday visit">Morning weekday visit</option>
</optgroup>
<optgroup label="Client2">
<option value="evening">evening</option>
<option value="Morning weekday visit">Morning weekday visit</option>
</optgroup>
<optgroup label="Client3">
<option value="afternoon">afternoon</option>
<option value="Morning weekday visit">Morning weekday visit</option>
</optgroup>
</select>
      <input id="visit_block_visit_price" name="visit_block[visit_price]" size="30" type="text" />
    </div>
  </div>
  <div class="form-actions">
    <button name="button" type="submit">submit</button>
  </div>
</form>
4

2 に答える 2

0

Viktorの答えが正しいことに加えて、HTMLマークアップにjavascriptコードを含めない方がはるかにクリーンだと思います。私はこのアプローチに従います:

$('#visit_block_visit_type').change(function() {
  $("#visit_block_visit_price").val(price($(this).val()));
});

それはまったく同じことです。

于 2013-02-18T16:40:54.120 に答える
0

ドロップダウンにフックを入れます:

<select id="visit_block_visit_type" onchange="fill_in_price(this)"...>

訪問タイプを価格にマッピングする価格関数があると仮定すると、次のように入力します。

fill_in_price = ->
  $("#visit_block_visit_price").val(price($(this).val()))
于 2013-02-18T16:35:33.467 に答える