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公式