web-dev-qa-db-ja.com

Rails)のcheck_box_tagにカスタムIDを使用する

Railsでcheck_box_tagヘルパーを使用する場合、どのようにカスタムIDを設定しますか?

コレクションに基づいてチェックボックスの束を作成するループがあります。

- subject.syllabus_references.each do |sr|
      = check_box_tag 'question[syllabus_reference]', sr.id, :id => sr.id
      = label_tag sr.id, sr.name

チェックボックスのラベルが正しく機能するようにカスタムIDを設定したいのですが、どのように機能するのか理解できないようです(:id => sr.idが機能しない...)。

問題は、ラベルの定義方法にもある可能性があるため、カスタムIDを設定せずに正しいチェックボックスを参照するように取得できれば、それでも問題ありません...

16
Ganesh Shankar

これをアプリケーションで使用して、コレクションからチェックボックスタグを作成し、それらの配列を送信しました。

<% @cursos.each do |c| %>
  <span class='select_curso'>
    <%= check_box_tag "vaga[curso_ids][]",
      c.id, (checked = true if form.object.curso_ids.include?(c.id)) %>
    <%= label_tag "vaga[curso_ids][][#{c.id}]", c.nome %>
  </span>
<% end %>

したがって、paramsには、文字列の代わりに配列"curso_ids" => ["1"、 "3"、 "5"]があります"curso_ids" => "5"。単一の値を返したい場合はvaga [curso_id]を使用し、そうでない場合はvaga [curso_ids] []を使用して配列を返します。

20
nanda

チェックボックスに追加のパラメータを指定すると、次のように機能します。

= check_box_tag 'question[syllabus_reference]', 1, nil, :id => sr.id
19
Will Tomlins

@Ganesh、ソリューションでは、結果のparamsハッシュは次の形式になります。

params[:question][:syllabus_reference] = {1 => 1, 2 => 2, 3 => 3, ...}

これらはあなたにとってよりうまくいくはずです:

check_box_tag "question[syllabus_reference][]", sr.id, checked, {:id => "question_syllabus_reference_#{sr.id}"

これが機能するには、3番目のパラメーター(チェック済み)が必要であることに注意してください。結果のparams配列は次のようになります

params[:question][:syllabus_reference] = {1, 2, 3, ...}
11
Leonel Galán

私はそれを理解したと思います...

- subject.syllabus_references.each do |sr|
  = check_box_tag "question[syllabus_reference][#{sr.id}]", sr.id
  = label_tag "question[syllabus_reference][#{sr.id}]", sr.name

これは機能しますが、もっと良い方法があれば教えてください!

3
Ganesh Shankar

これは非常に役に立ち、私の数日間の検索を終了させました。これまでに見つけたもののほとんどには、構文と追加のパラメーターが含まれており、Railsフラグが立てられるか、完全に無視されます。ビューからコントローラーに配列を渡し、チェックボックスを使用してどの配列要素を処理するかをコントローラーに伝えます。上記をさらに減らすことができました。

<%= check_box_tag "c[]", c.id %>

ここで、cは私のデータベースから来ています:

<%= @objects.each do |c| %>

もちろん、これはチェックされたエントリのみに関連するオブジェクトIDの配列をコントローラに渡します(:falseパラメータを省略したため、エントリはデフォルトでチェックされていません。ちなみに、これは-と同じ結果を生成します。 :true)、これはほぼ必要なすべてです。

ここで、オブジェクトタイプインジケーターを渡す必要があります(リテラル文字列だけでもうまくいきます)。これにより、コントローラーは、モデルに追加の列を追加しなくても、処理するオブジェクトのタイプを認識できます。今から始めて解決策を投稿しますが、すでに知っている場合は、これをすばやく簡単に行う方法があるかどうかをお知らせください。

1
Dave Sieving

HAMLサンプル

print属性を持つframedオブジェクトがどこかにあるとすると、printsのリストを表示する必要があるため、ループ内で、rowを更新するために各columnに一意のIDを持つカスタムcheckboxframedを作成します。

.input.row.collapse
  = check_box_tag :framed, print.framed, nil, { id: "framed_#{print.id}" }
1
d1jhoni1b

レイト、

ループを閉じるために、オブジェクトタイプインジケーターをcheck_box_tagに渡すことを諦めました。上記の前回の投稿(以下??)に示されている構文に追加したすべてのパラメーターにより、追加のデータを渡すことなく、チェックボックスの状態がデフォルトでチェックされていないではなくチェックされているになりましたコントローラに。

代替ソリューションが提示されたときに注意を払いながら、当面はオブジェクトタイプをsubmit_tag値に組み込みます。 submit_tag値は送信ボタンでユーザーに表示されるものであるため、これにより機能が表示に関連付けられますが、必要な明確化が提供されている場合でも、ビューが明確になると主張できます。コントローラ。

日々学ぶ...

0
Dave Sieving