Rails での JavaScript
概要
私は Rails を初めて使用するため、JS コードが実行されません。私のプログラムは、新しいページに切り替えることなく、同じページ上の回文の数値をチェックした結果を出力するはずですが、出力ボタンを押しても何も起こりません。 js コードはブラウザで有効になっており、必要なライブラリはすべてダウンロードされているようです (ただし、再確認が必要であることを私に知らせることはできます)。ブラウザには、js リクエストの 200 ステータスも表示されます。なぜ彼らは機能しないのでしょうか?
コード:
# app/controllers/palindrome_controller.rb
class PalindromeController < ApplicationController
def index; end
def show
@number = params[:number]
@error = validate_input(@number)
calculate_palindrome unless @error
respond_to do |format|
format.js
end
end
private
def validate_input(number)
return 'No number entered' if number =~ /\D/
return 'The number is already a palindrome' if number == number.reverse
nil
end
def calculate_palindrome
@number = @number.to_i
@results = []
while @number.to_s != @number.to_s.reverse
@results << @number
@number += @number.to_s.reverse.to_i
end
@results << @number
end
end
<!-- app/views/palindrome/index.html.erb -->
<h1>Testing the palindrome hypothesis</h1>
<%= form_with url: '/palindrome/show', method: 'get', remote: true do %>
<%= label_tag :number, "Enter a number:" %>
<%= text_field_tag :number %>
<%= submit_tag "Check" %>
<% end %>
<div id="results"></div>
# config/routes.rb
Rails.application.routes.draw do
root 'palindrome#index'
get 'palindrome/show', to: 'palindrome#show'
end
<!-- app/views/palindrome/show.js.erb -->
<% if @error %>
$("#results").html("<p><%= @error %></p>");
<% else %>
var table = "<table><tr><th>Step number</th><th>Current value</th></tr>";
<% @results.each_with_index do |result, index| %>
table += "<tr><td><%= index + 1 %></td><td><%= result %></td></tr>";
<% end %>
table += "</table>";
if ("<%= @results.last.to_s %>" == "<%= @results.last.to_s.reverse %>") {
table += "<p>The hypothesis is confirmed</p>";
} else {
table += "<p>The hypothesis has not been confirmed</p>";
}
$("#results").html(table);
<% end %>
解決策
Rails 7 を使用している場合は、Stimulus に切り替えることをお勧めします。 Rails アプリで Javascript コードを実行する場合は、この方がはるかに優れています。私はすべての Rails アプリでこれを使用しており、すべての Rails 7 アプリにすでにインストールされています。
次のチュートリアルをお勧めします。