私が知っている中でおそらく最も簡単で、これを処理する従来の方法の 1 つは、Ajax 要求を実行することです。通常、JavaScript はクライアント側で、Ruby はサーバー側です。
ルート ファイルでルートを作成し、対応するコントローラーで、HTML ではなく JavaScript で応答するアクションを作成できます。その JavaScript ファイルでは、ページ上の内容を変更または修正したり、変更した変数にアクセスしたり、ページの一部を再レンダリングしたりできます。ここでは jQuery を使用します。これは少しクリーンだからです。
あなたのルートファイルで:
post 'some_controller/make_a_change', to: 'some_controller#make_a_change'
次に、上で定義した関数で次のようにします。
$.ajax({
url:'/some_controller/make_a_change', //Defined in your routes file
data:(
'special_id=' + $('#special_id').val() + '&' +
'target_area_id=' + $('#target_area_id').val()
)
})
SomeController.rb では、次の方法で JavaScript の値にアクセスできますparams
。
def make_a_change
some_special_id = params[:special_id]
taid = params[:target_area_id]
@values = TargetArea.where(:special_id => some_special_id)
respond_to do |format|
format.js { render 'make_a_change' } #make_a_change.js.erb
end
end
その後、make_a_change.js.erb で残りを実行できると思います。これは、他の関数を呼び出して Ajax リクエストが成功するたびに実行されます。
var select2 = document.getElementById("target_area_id");
select2.options.length = 1;
select2.options[select2.options.length] = new Option(<%= @values.count %>,"1");
必要に応じて微調整してください。お役に立てれば!
アップデート:
私はちょうどこの行に気づきました:
select2.options[select2.options.length] = new Option(<%= @values.count %>,"1");
動作しない場合があります。それが HTML 選択ボックスまたは類似のものである場合、それを独自のビューに配置し、make_a_change.js.erb の適切な場所に再レンダリングできます。
そのようです:
$('#some_div').html('<%= j render 'select2_list', values:@values %>')
ほとんどの場合、私の答えの背後にあるテーマは次のとおりです。JavaScript 関数から Ruby コードまたはサーバー データとやり取りしたい場合、これはボタンをクリックするか、ボックスまたはそれらの行に沿って何かをチェックしたときに呼び出される関数です。 Ajax リクエストをサーバーに送信し、コントローラーでリクエストを処理します。=
これにより、Rails に近づき、2 つの異なる言語変数を記号でリンクしようとすることからさらに遠ざかることができます。