كيف يمكنني تعيين معرف فريد من نوعه لخانات الاختيار في نموذج القضبان متعددة السجلات؟
-
13-09-2019 - |
سؤال
لقد قمت بإعداد قضبان نموذج بعد التعليمات تقريبا هذه رايلاست.
إليك رمز النموذج:
<% 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 جزئي:
<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 وأحتاج إلى كل مربع اختيار للحصول على معرف فريد. الآن، فإن علامات الإدخال التي تم إنشاؤها تبدو شيئا مثل هذا:
<input id="todo_ids_" name="todo_ids[]" type="checkbox" value="7" />
كل خانة اختيار لها نفس المعرف ("toDo_ids_")، وهي مشكلة. أظن أن الحل بسيط محرج، لكنني لا أرى ذلك. أي نصائح؟
المحلول 2
انتهى بي الأمر باستخدام حل مشابه ل Ryan's، ولكن كما كتبت في التعليق، اضطررت إلى إجراء تغيير إضافي. في التشكيل:
<%= check_box_tag "todo_ids[#{todo.id}]", todo.id %>
في الإجراء يسمى النموذج:
Todo.update_all(["completed_at = ?", Time.now], :id => params[:todo_ids].keys)
ملاحظة "المعالم [: toDo_ids] .keyes" في النهاية، التي كانت حلوة للتعامل مع الطريقة الفردية التي تم تنسيق المعلمات:
"todo_ids" => {"5"=>"5"}
نصائح أخرى
<%= check_box_tag "todo_ids[]", todo.id, false, :id => "todo_id_#{todo.id}" -%>
أو كل ما تريد أن يكون المعرف.
أنا أعتبر هذا الخطأ مع Check_Box_tag الناجم عن طبيعة تتبع يبدو يدويا لإعطائه يدويا اسم ToDo_IDS [] ورمز الطريقة التي يتصل بها Sanitize_to_ID (الاسم). أنا فقط ركضت هذا بالأمس وأنا أفكر في التصحيح.
هل يمكنك تجربة هذا واسمحوا لنا أن نعرف ما إذا كان يعمل:
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
بالطبع يمكنك استخدام الأقراص داخل الكتلة، فقط تمر واستخدم Builder Inside.
تحقق من خيارات المزيد في مستندات API.