#わからないこと
Rails6で簡単なCRUDを実現するアプリケーションを作成しています。
ボタンをクリックすることで、フォーム内の要素を変更させる処理をJavaScriptで書きました。
HTML内に直接書いた関数は呼び出すことができるのですが、JSファイルに記述した関数を呼び出すことができません。
「Uncaught ReferenceError: state_change is not defined at HTMLButtonElement.onclic」
というエラーが返ってきます。直接書いた関数が呼び出せる以上、記述にミスはないと思うのですが…。
よろしくお願いいたします。
#問題が起きている部分
HTMLerb
1<!-- app/views/tasks/_form.html.erb --> 2 3<%= form_with model: task, local: false, class: 'form' do |f| %> 4 <% if value == 'CREATE' %> 5 <% title = 'Add Task' %> 6 <% else%> 7 <% title = 'Edit Task' %> 8 <% end %> 9 10 <h2><%= title %></h2> 11 12 <div class="form-row"> 13 <%= f.label :state, "State : " %> 14 <%= button_tag 'TODO', type: 'button', 15 class: "state-btn btn", 16 id: "state_btn", 17 onclick: 'state_change()' %> 18 <%= f.text_field :state, value: "TODO" %> 19 </div> 20 21 <div class="form-row"> 22 <%= f.label :limit, "Limit : " %> 23 <%= f.date_field :limit, 24 class: "limit", 25 value: Date.current.strftime() %> 26 </div> 27 28 <div class="form-row"> 29 <%= f.label :content, "Task : " %> 30 <%= f.text_field :content %> 31 </div> 32 33 <%= f.submit value, class: "submit btn" %> 34 35 <% if value == 'UPDATE' %> 36 <%= link_to 'CANCEL', new_task_path, data: { remote: true } %> 37 <% end %> 38<% end %> 39 40<%= javascript_pack_tag 'form' %> 41 42<!-- 直接関数を書くと呼び出すことができる --> 43 44<%# <script> 45 function state_change() { 46 var state_btn = document.getElementById('state_btn'); 47 var state_text = document.getElementById('task_state'); 48 49 if (state_btn.innerHTML == 'TODO') { 50 state_btn.innerHTML = 'DOING'; 51 state_text.value = 'DOING'; 52 } else if (state_btn.innerHTML == 'DOING') { 53 state_btn.innerHTML = 'DONE'; 54 state_text.value = 'DONE'; 55 } else if (state_btn.innerHTML == 'DONE') { 56 state_btn.innerHTML = 'TODO'; 57 state_text.value = 'TODO'; 58 } 59 } 60</script> %> 61
JavaScript
1 2// app/javascript/packs/form.js 3 4function state_change() { 5 var state_btn = document.getElementById('state_btn'); 6 var state_text = document.getElementById('task_state'); 7 8 if (state_btn.innerHTML == 'TODO') { 9 state_btn.innerHTML = 'DOING'; 10 state_text.value = 'DOING'; 11 } else if (state_btn.innerHTML == 'DOING') { 12 state_btn.innerHTML = 'DONE'; 13 state_text.value = 'DONE'; 14 } else if (state_btn.innerHTML == 'DONE') { 15 state_btn.innerHTML = 'TODO'; 16 state_text.value = 'TODO'; 17 } 18} 19 20// ↓ こちらの関数は正しく呼び出されているため、JSファイルが読み込まれていないわけではない 21window.onload = function () { 22 var state = document.getElementById('state_btn'); 23 var state_text = document.getElementById('task_state'); 24 console.log(state); 25 console.log(state_text); 26}
試したこと
<%= javascript_pack_tag 'form' %>
JSファイルを読み込む場所を変えてみたりもしましたが、意味がありませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/11 08:34
2021/06/11 09:02