マルチレコードレールフォームにチェックボックスの一意のIDを設定するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/992094

質問

の指示に従って、レールフォームを設定しました これ Railscast。

フォームのコードは次のとおりです。

<% form_tag complete_todos_path, :method => :put do %>
    <ul>
    <div id="incomplete_todos">
    <% @incomplete_todos.each do |todo| %>
        <%= render :partial => todo %>
    <% end %>
    </div>
    </ul>
    <%= submit_tag "Mark as completed" %>
<% end %>

そして、これがtodo partialのコードです:

<div class="todo">
    <li>
        <%= check_box_tag "todo_ids[]", todo.id %>
        <%=h todo.name %>
        <%= link_to 'edit', edit_todo_path(todo) %>
        <%= link_to 'delete', todo, :confirm => 'Are you sure?', :method => :delete %>
    </li>
</div>

うまく機能していますが、Ajaxの実装を開始したいと考えています。一意のIDを持つには、各チェックボックスが必要です。現在、生成された入力タグは次のように見えます:

<input id="todo_ids_" name="todo_ids[]" type="checkbox" value="7" />

すべてのチェックボックスには同じID( "todo_ids_")があり、これは問題です。解決策は恥ずかしいほどシンプルだと思いますが、私はそれを見ていません。任意のヒント?

役に立ちましたか?

解決 2

私はライアンのような解決策を使用することになりましたが、コメントで書いたように、私はさらなる変更を加えなければなりませんでした。形式:

<%= check_box_tag "todo_ids[#{todo.id}]", todo.id %>

フォームで呼ばれるアクションで:

Todo.update_all(["completed_at = ?", Time.now], :id => params[:todo_ids].keys)

最後に「params [:todo_ids] .keys」に注意してください。これは、パラメーターがフォーマットされた奇妙な方法に対処するための回避策でした。

"todo_ids" => {"5"=>"5"}

他のヒント

<%= check_box_tag "todo_ids[]", todo.id, false, :id => "todo_id_#{todo.id}" -%> または、IDになりたいものは何でも。

これは、TODO_IDS []という名前とSanitize_To_id(名前)を呼び出すメソッドコードを手動で与えるという一見ハッキッシュな性質によって引き起こされるCHECK_BOX_TAGのバグだと思います。私は昨日これに出会ったばかりで、パッチを考えています。

これを試して、それが機能するかどうかをお知らせください:

check_box_tag "todo_ids[#{todo.id}]", todo.id %>

これが予想される動作です check_box_tag, 、 なので 拒否された修正に関するこのコメントは説明しています.

使用できます collection_check_boxes このような (ハムル 構文、ごめんなさい):

# Accumulate todos in a params hash like { todos: { to_complete: [] } }
= collection_check_boxes(:todos, :to_complete, @incomplete_todos, :id, :name) do |todo_builder|
  = todo_builder.label do
    # This is the result of calling :name on the todo, as specified
    # calling the helper
    = todo_builder.text
    = todo_builder.check_box

もちろん、ブロック内の部分的な部分を使用して、パスして内部のビルダーを使用できます。

でより多くのオプションを確認します APIドキュメント.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top