質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3551閲覧

Rails6 onclickでJSの関数がなぜ呼び出せないのかがわかりません

Hamadust

総合スコア5

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/06/10 17:18

#わからないこと
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ファイルを読み込む場所を変えてみたりもしましたが、意味がありませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

すみません、Rails6を利用したことないながらの回答になってしまうのですが、
Rails6でscriptを外部で書いた場合、なにかビルドが走るんですかね??
そうであれば記述したjavascriptが関数でラッピングされてる可能性があるので、HTML側から呼び出せないのかもしれません。

質問者さんの関数をonclickで呼び出したいならglobal領域に突っ込んであげると上手くいくかもしれません。(スマホで書いてるので間違いあったらすんません^^;)

javascript

1window.state_change = function () { 2〜処理〜 3}

ただ、なんでもかんでもwindowに突っ込むと、汚染されてバッティング等を引き起こす可能性もあるので、HTMLのonclick以外も検討してみてください。
https://developer.mozilla.org/ja/docs/Web/API/GlobalEventHandlers/onclick
https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener

投稿2021/06/10 20:11

編集2021/06/10 20:14
runnynose

総合スコア497

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hamadust

2021/06/11 08:34

ご回答ありがとうございます。 window.state_change = dunction () {} で関数を呼び出すことができました。 どうやら「関数でラッピングされている」というのはあると思います。 このあたり、勉強不足なのでしっかり調べたいと思います。 HTMLのonclickではやはりグローバル領域からでないと呼び出せないので、 ご回答がヒントとなり、 state_btn.addEventListener('click', state_change) と記述することで期待する動作を実現することができました。 また、何かありましたらよろしくお願いいたします。
runnynose

2021/06/11 09:02

おそらくこういったフレームワークは、他のjavascriptと干渉し合わないように配慮がされているんでしょうね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問