tag:crieit.net,2005:https://crieit.net/tags/Ajax/feed 「Ajax」の記事 - Crieit Crieitでタグ「Ajax」に投稿された最近の記事 2019-12-14T14:25:38+09:00 https://crieit.net/tags/Ajax/feed tag:crieit.net,2005:PublicArticle/15607 2019-12-14T11:44:05+09:00 2019-12-14T14:25:38+09:00 https://crieit.net/posts/Rails-Bootstrap-Ajax 【Rails】Bootstrapを導入したらAjaxが機能しなくなっていたお話 <h2 id="参考にしたサイト"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88">参考にしたサイト</a></h2> <ul> <li>参考1<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/yusaku_/items/33f09999e403f7a2d2df">【Rails】 jQueryが動作しない時の対処法 (読み込む順番に気をつけないといけない) - Qiita</a></li> <li><p>参考2<br /> <a target="_blank" rel="nofollow noopener" href="https://macoblog.com/jquery-saishin/#h-anker11">【2019年版】jQuery最新の読み込みスクリプト「コピペOK+裏技」 | マコブログ</a></p></li> <li><p>今回の自作Railsアプリはこちら。<br /> <a target="_blank" rel="nofollow noopener" href="https://workdiary-al.herokuapp.com/">Workdiary</a><br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/Massasquash/workdiary">GitHub - Massasquash/workdiary</a></p></li> </ul> <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <h2 id="1.起こったこと"><a href="#%EF%BC%91%EF%BC%8E%E8%B5%B7%E3%81%93%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">1.起こったこと</a></h2> <p>Railsアプリで、Ajax(jQuery)を使用した機能を作っていてしばらく上手く動いていたのですが、Bootstrapを導入してjavascript周りをいじってから機能しなくなっていました。</p> <h2 id="2.解決策"><a href="#%EF%BC%92%EF%BC%8E%E8%A7%A3%E6%B1%BA%E7%AD%96">2.解決策</a></h2> <p>とても簡単なことで、HTMLファイルの<code>head</code>タグ内に記述すべき<code>jQuery CDN</code>(<code>script</code>タグ)の位置が間違っていたのが原因でした。<br /> さらにこの<code>jQuery CDN</code>(<code>script</code>タグ)と<code>javascript_include_tag</code>の順番がこの通りになっていることが大事なようです。(<a target="_blank" rel="nofollow noopener" href="https://qiita.com/yusaku_/items/33f09999e403f7a2d2df">参考リンク1</a>)</p> <p><strong>app/views/layouts/application.html.erb</strong></p> <pre><code><head> ・ ・ ・ <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> </head> </code></pre> <h2 id="3.解説・補足"><a href="#%EF%BC%93%EF%BC%8E%E8%A7%A3%E8%AA%AC%E3%83%BB%E8%A3%9C%E8%B6%B3">3.解説・補足</a></h2> <p>bootstrapを導入する際に、<code>body</code>タグの一番下に<code>jQuery CDN</code>(<code>script</code>タグ)を移動してしまっていたのが原因のようです。<br /> 記述する位置には気をつけましょう!</p> <h3 id="修正のためやってみたこと"><a href="#%E4%BF%AE%E6%AD%A3%E3%81%AE%E3%81%9F%E3%82%81%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E3%81%93%E3%81%A8">修正のためやってみたこと</a></h3> <ul> <li>Javascriptファイルが読み込まれているか確かめる</li> </ul> <p>このAjaxを使用している部分は「フォーム入力時にプルダウンでテンプレートを選択 → 選択されたテンプレートの中身がフォームに自動入力される」という機能なのですが、<br /> まずはjavascriptが正常に読み込まれていないのかと思い、<br /> 試しに「プルダウンを選択した時に選択されたテンプレートがアラートで表示される」ように、呼び出されるjavascriptに<code>alert(template_id)</code>を記述してみたところ、しっかりとアラートが出てきました。<br /> javascriptは機能しているようです。</p> <ul> <li>Ajax(jQuery)が機能しているか確かめる</li> </ul> <p>次に、Ajaxで渡されるはずのtemplatesコントローラーの<code>get_body</code>アクションが処理されているかを調べました。適当な行に<code>raise params.inspect</code>と入れることで、その箇所でエラーが発生するはずです。<br /> ところがプルダウンリストを選択してもエラーは発生せず、フォームにも何も反映されません。<br /> Ajaxが機能せず、目的のコントローラーのアクションに渡っていないことがわかりました。<br /> javascriptは読み込まれていても、Ajaxが動作しない。<br /> つまりjQueryの読み込みが上手くいってなさそうで、調べてみると(<a target="_blank" rel="nofollow noopener" href="https://qiita.com/yusaku_/items/33f09999e403f7a2d2df">参考リンク1</a>)にたどり着いた経緯です。</p> <h3 id="用語"><a href="#%E7%94%A8%E8%AA%9E">用語</a></h3> <ul> <li>jQuery CDN</li> </ul> <p>という単語が出てきましたが、(<a target="_blank" rel="nofollow noopener" href="https://macoblog.com/jquery-saishin/#h-anker11">参考リンク2</a>)によると、<br /> jQueryを使うには、jQuery本体をダウンロードして読み込む方法と、CDNを経由して使う方法の2種類があるようです。後者の方が、jQueryをダウンロードする必要がなく、今回のようにHTMLファイルの<code>head</code>タグ内に以下のような<code>sqript</code>タグを貼り付けるだけでjQueryが動作するようになります。</p> <pre><code> <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script> </code></pre> <ul> <li>SDN</li> </ul> <p>これが概念としてまだイマイチ理解できませんでした。<br /> 宿題とします。</p> <h2 id="MEMO"><a href="#MEMO">MEMO</a></h2> <p>参考までに該当部分のコードを晒しておきます。<br /> (色々余計なコードもそのままにしていると思うので、初心者の方は参考にしないでください…)</p> <p><strong>app/views/layouts/application.html.erb</strong></p> <pre><code><head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> <title>Workdiary</title> <%= csrf_meta_tags %> <%= csp_meta_tag %> <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> </head> </code></pre> <p><strong>app/assets/javascripts/application/js</strong></p> <pre><code>function changeTemplate(val){ var template_id = val; // alert(template_id) $.ajax({ url: "/templates/get_body", type: "GET", data: { template_id: template_id } }) } </code></pre> <p><strong>app/controllers/concerns/templates_controller.rb</strong></p> <pre><code> def get_body template = Template.find(params[:template_id]) @template_body = template.body respond_to do |format| format.js end end </code></pre> Massa tag:crieit.net,2005:PublicArticle/15477 2019-10-13T23:43:10+09:00 2019-10-13T23:43:10+09:00 https://crieit.net/posts/960b0aeb50068c42582d201c7dd14467 熨斗(のし)の王様を作ったときに気をつけたこと <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://noshi-king.matsubarase.com">のし王</a>というWebサービスを作った。<br /> <a href="https://crieit.now.sh/upload_images/fffb317da90f57ce80e2986ead5be3bd5da337e03f206.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fffb317da90f57ce80e2986ead5be3bd5da337e03f206.png?mw=700" alt="のし王サムネイル" /></a></li> <li>のし作成サービスが既に存在する中で、下記に気をつけたというお話。 <ul> <li>サービス作成のきっかけになった不満点・ニーズをもれなく仕様に落とし込む</li> <li>仕様策定時は技術的な楽さに甘えず、ユーザー体験を優先する</li> <li>上記を実現するため必要最低限の技術を選定する</li> </ul></li> </ul> <h1 id="不満点の解消、ニーズを仕様に落とし込む"><a href="#%E4%B8%8D%E6%BA%80%E7%82%B9%E3%81%AE%E8%A7%A3%E6%B6%88%E3%80%81%E3%83%8B%E3%83%BC%E3%82%BA%E3%82%92%E4%BB%95%E6%A7%98%E3%81%AB%E8%90%BD%E3%81%A8%E3%81%97%E8%BE%BC%E3%82%80">不満点の解消、ニーズを仕様に落とし込む</a></h1> <ul> <li>ちょっとした贈り物に「のし」をつけたかった。</li> <li>既存サービスは、以下の点で不満が残った。 <ul> <li>「のし紙」のテンプレート(背景画像)だけが提供されており、Wordなどに貼り付けた後、自分で文字を描かないとダメだった</li> <li>Web上で任意の文字まで入れられるサービスでは、最後になるまで仕上がり具合がが分からなかった</li> <li>最終画像にサービス名のロゴが入ってしまい、贈り物には不向きだった</li> <li>フォントがしょぼかった</li> <li>水引き(背景画像)や表書き(御礼などの上部の文字)をどう選んでよいか分からなかった</li> </ul></li> <li>不満点の解消をもれなく仕様に落とし込んだ。 <ul> <li>背景画像と任意の文字を組み合わせてPDFで出力できるようにする</li> <li>最終出力結果には広告を入れない</li> <li>有料でもカッコいいフォントを採用する</li> <li>用途に応じて自動で「水引き」と「表書き」が選択できるようにする</li> </ul></li> <li>マッスルの神様 = マ神 → 熨斗の王様 = のし王</li> </ul> <h1 id="ユーザー体験を最優先する"><a href="#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E4%BD%93%E9%A8%93%E3%82%92%E6%9C%80%E5%84%AA%E5%85%88%E3%81%99%E3%82%8B">ユーザー体験を最優先する</a></h1> <div class="table-responsive"><table> <thead> <tr> <th align="left"></th> <th align="left">技術的な楽さを優先</th> <th align="left">ユーザー体験を優先</th> </tr> </thead> <tbody> <tr> <td align="left">文字描画</td> <td align="left">ユーザー自身がWordなどで描画</td> <td align="left">Webサービス上で描画</td> </tr> <tr> <td align="left">仕上がり確認</td> <td align="left">プレビュー不可 or プレビューボタンクリックで表示</td> <td align="left">リアルタイムプレビュー表示</td> </tr> <tr> <td align="left">水引き、表書き</td> <td align="left">ユーザーの選択したものを表示</td> <td align="left">用途を選ぶと最適な水引き、表書きを自動で選択</td> </tr> <tr> <td align="left">描画フォント</td> <td align="left">無料の範囲で選択可能</td> <td align="left">有料で質の良いフォントが選択可能</td> </tr> <tr> <td align="left">ユーザーが泥酔状態</td> <td align="left">酔いが冷めてから使う</td> <td align="left">泥酔状態でも直感で使える</td> </tr> </tbody> </table></div> <h1 id="仕様の実現方法を考える"><a href="#%E4%BB%95%E6%A7%98%E3%81%AE%E5%AE%9F%E7%8F%BE%E6%96%B9%E6%B3%95%E3%82%92%E8%80%83%E3%81%88%E3%82%8B">仕様の実現方法を考える</a></h1> <ul> <li>使用した技術 <ul> <li>Webサービス上で文字描画しPDF出力 <ul> <li>水引きの種類や表書きなどの情報をブラウザ上で選択させる</li> <li>サーバーでPDFを作成してダウンロードさせる(Golang/Google App Engine)</li> </ul></li> <li>リアルタイムプレビュー表示 <ul> <li>サムネイル描画サーバー(Golang/Google App Engine)を準備</li> <li>水引きの種類や表書きなどの情報が変更されたらAjax(jQuery)でサーバーからサムネイル画像を取得し、ブラウザ上に即時反映</li> </ul></li> <li>用途を選ぶと最適な水引き、表書きを自動で選択 <ul> <li><a target="_blank" rel="nofollow noopener" href="https://wikiki.github.io/components/quickview/">Bulma-ExtensionsのQuickView</a>で用途一覧を表示</li> <li>用途を入力させて絞り込み(jQuery)</li> <li>用途クリックで「水引き」と「表書き」を最適なものに変更(jQuery)</li> </ul></li> </ul></li> <li>選定理由 <ul> <li>仕様実現に際して最低限/シンプルなものを選ぶ</li> <li>最新の技術よりも枯れて安定した技術を選ぶ</li> <li>なるべくメンテナンスが不要なものを選ぶ</li> </ul></li> </ul> Matsubarase.com公式