フォームがOrder
モデル用parts
であり、というフィールドの値に基づいてコレクションを変更していると仮定しますregion
。
フォームビューを更新します。region
フォーム、フィールド、およびフィールドのIDを指定しparts
ます。
= simple_form_for(@order, :html => { :id => "order-form"}) do |f|
= f.input :region, :wrapper_html => { :id => "order-form-region", |
"data-parts-url" => parts_orders_path(:id => @order.id, :region => @order.region)} |
= f.input :parts, as: check_boxes, collection: @parts_list, |
:wrapper_html => { id' => 'parts-check-box-list'} |
ファイルで呼び出される新しいアクションを追加parts
しroute.rb
ます。
resources :orders do
collection do
get :parts
end
end
コントローラに新しいアクションを追加します
class OrdersController < ApplicationController
# expects id and region as parameters
def parts
@order = params[:id].present? ? Order.find(params[:id]) : Order.new
@parts_list = Part.where(:region => params[:region])
end
end
ヘルパーを追加する
def parts_collection(order, parts_list)
"".tap do |pc|
# to generate the markup for collection we need a dummy form
simple_form_for(order) do |f|
pc << f.input(:parts, as: check_boxes, collection: parts_list,
:wrapper_html => {:id => 'parts-check-box-list'})
end
end
end
アクションのjsビューを追加します(orders/parts.js.erb
)
$('#parts-check-box-list').replaceWith('<%= j(parts_collection(@order, @parts_list)) %>');
region
のフィールドのデータ変更イベントハンドラーを登録しますapplication.js
$(document).ready(function() {
$('#order-form').on("change", "#order-form-region", function () {
// Access the data-parts-url set in the region field to submit JS request
$.getScript($(this).attr('data-parts-url'));
});
});