Techioz Blog

form_tag がレールでパッチ呼び出しをトリガーしない

概要

以下は、さまざまな生徒のステータスを更新するコードですが、問題は、彫像にいくつかの変更を加えた後、ステータスの更新をクリックしても何も起こらないことです。

students/manage_users.html.erb

<div class="col-sm-9 col-xs-12">
  <div class="content" role="main" id="main-content">
    <article>
      <div>
        <div class="table-responsive">
          <table class="table table-bordered">
            <thead>
              <tr>
                <th><%= link_to "Primary Student", :sort => "student_1_firstname" %></th>
                <th>Admin Status</th>
                <th>Superadmin Status</th>
              </tr>
            </thead>
            <%= form_tag update_status_path, :method => 'patch' do %>
              <tbody>
                <% @students.each do |student| %>
                  <tr> 
                    <td><%= link_to student.email,student_path(student) %></td>

                    <td><%= check_box_tag "students[#{student.id}][admin]", true, student.admin, class: 'status', data: {id: student.id, type: 'admin'} %></td>
                    <td><%= check_box_tag "students[#{student.id}][superadmin]", true, student.superadmin, class: 'status', data: {id: student.id, type: 'superadmin'} %></td>
                  </tr>
                <% end %>
              </tbody>
            </table>
            <%= submit_tag "Update Status" %>
          <% end %>
        </div>
        <div class="clearfix"></div>
      </div>
    </article>
  </div>
<!-- .content -->
</div>
<!-- END .main_column_css -->

ルート.rb

patch 'main-admin/manage_users', to: 'students#update_status', as: 'update_status'

コントローラ

class StudentsController < ApplicationController
  def update_status
    @students = Student.all
    students = params[:students]
    @students.each do |student|
      student.update_attributes(admin: students[student.id.to_s] && students[student.id.to_s]['admin'] ? true : false, superadmin: students[student.id.to_s] && students[student.id.to_s]['superadmin'] ? true : false)
    end
  end
end

これを修正するのを手伝ってください

解決策

HTML が無効です。

MDN によると、

要素で許可されるコンテンツは、非常に狭いフロー コンテンツのセットに制限されています。

In this order:

 1. an optional <caption> element, 
 2. zero or more <colgroup> elements, 
 3. an optional <thead> element, 
 4. either one of the following: 
    - zero or more <tbody> elements 
    - one or more <tr> elements 
 5. an optional <tfoot>
    element

フォームはフロー コンテンツではありません。

また、終了タグが一致していないため、混乱が生じます。 form タグをテーブルの外に移動します。

<div class="col-sm-9 col-xs-12">
  <div class="content" role="main" id="main-content">
    <article>
      <div>
        <div class="table-responsive">
          <%= form_tag update_status_path, method: :patch do %>
            <table class="table table-bordered">
              <thead>
                <tr>
                  <th><%= link_to "Primary Student", :sort => "student_1_firstname" %></th>
                  <th>Admin Status</th>
                  <th>Superadmin Status</th>
                </tr>
              </thead>
              <tbody>
                <% @students.each do |student| %>
                <tr> 
                  <td><%= link_to student.email, student_path(student) %></td>
                  <td><%= check_box_tag "students[#{student.id}][admin]", true, student.admin, class: 'status', data: {id: student.id, type: 'admin'} %></td>
                  <td><%= check_box_tag "students[#{student.id}][superadmin]", true, student.superadmin, class: 'status', data: {id: student.id, type: 'superadmin'} %></td>
                </tr>
                <% end %>
              </tbody>
            </table>
            <%= submit_tag "Update Status" %>
          <% end %>
        </div>
        <div class="clearfix"></div>
      </div>
    </article>
  </div>
</div>

© 2024 Techioz. All rights reserved.