フォームがOrder
モデル用で、region
というフィールドの値に基づいてparts
コレクションを変更しているとします。
フォームビューを更新します。フォームのIDはregion
フィールド、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'} |
route.rb
ファイルにparts
と呼ばれる新しいアクションを追加します。
resources :orders do
collection do
get :parts
end
end
は
$('#parts-check-box-list').replaceWith('<%= j(parts_collection(@order, @parts_list)) %>');
登録データ(orders/parts.js.erb
)アクションのためのJSビューを追加ヘルパー
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
を追加するには、コントローラに
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
を新しいアクションを追加します。変更イベントあなたの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'));
});
});
に行く場合は、この作業を見ることができますしかし、どのように動的にこれを行うことができますか? ... – andrewdotnich
b.objectはコレクションの個々の要素なので、{identifier:b.object.identifier}などのデータをグループ内の各チェックボックスに与えます。アトリビュート(input_htmlに入れた場合は、すべて同じ値と反対です) –
まず、1年半の応答遅れで申し訳ありません! 私はこの答えが一番好きです。書くことができる余分なRuby&JSコードがあるにもかかわらず、とてもシンプルです。私はそれをテストしていません(私は長い間、そのプロジェクトと雇用者の両方から移ってきました)が、それがうまくいくと仮定すると、各要素のロボットのリストをデータ要素に入れておくと意味があり、と対戦する。ありがとうございました! – yoz