tag:crieit.net,2005:https://crieit.net/tags/RubyOnRails/feed 「RubyOnRails」の記事 - Crieit Crieitでタグ「RubyOnRails」に投稿された最近の記事 2020-05-01T22:32:30+09:00 https://crieit.net/tags/RubyOnRails/feed tag:crieit.net,2005:PublicArticle/15885 2020-05-01T22:32:30+09:00 2020-05-01T22:32:30+09:00 https://crieit.net/posts/Rails Railsでモーダルの出し分けを管理する <p>Railsでモーダルの表示処理をまとめて衝突しないように管理する方法を紹介します。</p> <h1 id="背景"><a href="#%E8%83%8C%E6%99%AF">背景</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://tsukulink.net/">ツクリンク</a>を運営する中でモーダルが少しづつ増え、衝突することがあったためモーダルの優先順位を付け、衝突しないよう実装をしました。</p> <h1 id="実装"><a href="#%E5%AE%9F%E8%A3%85">実装</a></h1> <h2 id="前提"><a href="#%E5%89%8D%E6%8F%90">前提</a></h2> <p>以下の3つのモーダルがあるとします。</p> <ul> <li>A: 初回ログインで出すモーダル(全ページ)</li> <li>B: 特定のユーザーにだけお知らせを出すモーダル(全ページ)</li> <li>C: 特定のページで出すモーダル(Posts#show)</li> </ul> <h2 id="コードサンプル"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB">コードサンプル</a></h2> <p>全ページに出すモーダルはApplicationControllerで該当ユーザーか判断しモーダルに必要な情報をセットします。</p> <pre><code class="ruby"># controllers/application_controller.rb class ApplicationController < ActionController::Base before_action :set_modal_A before_action :set_modal_B def set_modal_A return if cookies['modal_A'].present? # 表示済みなら何もしない if is_first_signed_in? # 初回ログインか? @modal_A = { title: '表示に必要な情報など' } end end def set_modal_B return if cookies['modal_B'].present? # 表示済みなら何もしない if show_notice? # お知らせを出すユーザーか? @modal_B = true end end end </code></pre> <p>Viewごとに出るモーダルは <code>provide</code> でモーダルをセット</p> <pre><code class="ruby"># views/posts/show.html.erb <% provide :modal, render('modal/C') %> </code></pre> <p>レイアウトのView(もしくはそれに準ずるパーシャル)でモーダルの出し分けを行います。<br /> ifの上位にあるものが優先され、モーダルが複数renderされるのを防いでいます。</p> <pre><code class="ruby"># views/layouts/application.html.erb <% if yield(:modal).present? %> <%= yield(:modal) %> <% elsif @modal_B.present? %> <%= render 'modal/B' %> <% elsif @modal_A.present? %> <%= render 'modal/A' %> <% end %> </code></pre> <p>各モーダルのViewでは表示を管理するCookieを保存するなどの処理をしています。</p> <pre><code class="ruby"># views/modal/A.html.erb <% cookies.permanent['modal_A'] = { value: true, expires: 1.day } %> <div class="modal">お知らせだよ!</div> </code></pre> あっきー💃 tag:crieit.net,2005:PublicArticle/15716 2020-02-14T10:00:08+09:00 2020-02-14T10:00:08+09:00 https://crieit.net/posts/Windows-Docker-Rails-sprockets Windows+Docker+Railsでsprocketsのエラーが出る時 <p>Docker for Windowsのコンテナ内でRailsを動かしていると、 <code>Errno::EEXIST in Sessions#new</code> というエラーが出るようになった。バージョンはRails5.1、sprockets3。具体的にはこんなエラー。</p> <pre><code>File exists @ dir_s_mkdir - /app/tmp/cache/assets/sprockets/v3.0/ta </code></pre> <p>何かよくわからないが、ファイルが作れないというエラー。そのパスを見てみても同じファイルはない。…と思いきや、Windowsの場合、大文字小文字を区別していないので大文字のファイルが見つかった。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e45efba2b4d7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e45efba2b4d7.png?mw=700" alt="" /></a></p> <p>ということでWindows環境特有の問題らしい。調べてみるとすでにissueが立っていた。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/rails/sprockets/issues/283">FileStore cache patch in v3.6 causes directory name collisions in Windows · Issue #283 · rails/sprockets</a></p> <h2 id="解決方法"><a href="#%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95">解決方法</a></h2> <p>で、上記のissueにとりあえず動かせる方法を書いてくれてる人がいた。デフォルトだとアプリケーションのtmpフォルダ内にファイルが作られてしまうが、それを変えてしまう方法。</p> <p><code>config/initializers/assets.rb</code> に下記を追記。</p> <pre><code class="ruby">Rails.application.config.assets.configure do |env| env.cache = Sprockets::Cache::FileStore.new( ENV.fetch("SPROCKETS_CACHE", "#{env.root}/tmp/cache/assets"), Rails.application.config.assets.cache_limit, env.logger ) end </code></pre> <p>あとは.envでもdocker-compose.ymlでもいいので、キャッシュを保存したい、Windowsのフォルダをマウントしていないコンテナ内のフォルダをSPROCKETS_CACHEという環境変数で指定するだけ。コンテナ作成後の初回だけすごく時間がかかるので、docker-comose.yml内にこんな感じでボリュームを作っておくと早い。</p> <pre><code class="yaml">web: environment: - SPROCKETS_CACHE=/cache volumes: - .:/app - cache:/cache volumes: cache: </code></pre> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15621 2019-12-18T23:02:34+09:00 2019-12-18T23:02:34+09:00 https://crieit.net/posts/Rails6-Ruby Rails6 ビューファイルにRubyのコード書く時の<% %>と<%= %>の違い <h1 id="&lt;% %&gt;と&lt;%= %&gt;の違い"><a href="#%26lt%3B%25+%25%26gt%3B%E3%81%A8%26lt%3B%25%3D+%25%26gt%3B%E3%81%AE%E9%81%95%E3%81%84"><% %>と<%= %>の違い</a></h1> <ul> <li>: この中に書いたコードは表示されない。変数定義やif文などの記載に使う。</li> <li>: この中に書いたコードは表示される。ビューファイル上に変数の値を表示したい時などに使用する</li> </ul> miriwo: 19年7月7日からQiita毎日投稿中! tag:crieit.net,2005:PublicArticle/15219 2019-07-09T21:24:53+09:00 2019-07-09T21:50:57+09:00 https://crieit.net/posts/Faraday Faradayで変数内のデータをファイルとして送信する <p>Faradayを使うと簡単にファイルをmultipart形式でPOSTしてアップロードしたりすることができる。</p> <p>具体的にはUploadIOを使うことで簡単に指定できる。</p> <pre><code class="ruby">params = { file: Faraday::UploadIO.new("file.txt", "text/plain") } </code></pre> <p>ただ、送信したいデータを元々変数で持っている場合、この方法だとわざわざ一度ファイルに保存して送信しなければならない。テキストやRuby上で生成したCSV、ネットワーク経由で画像などはファイルでなく変数に持っているだけの場合も多いと思う。その場合はなんとなく面倒だし冗長。</p> <p>この場合、UploadIOのソースを見てみたところIOであれば問題ないようなので下記のようにして文字列をそのまま送信することもできる。</p> <pre><code class="ruby">params = { file: Faraday::UploadIO.new(StringIO.new(text_value), 'text/plain') } </code></pre> <p>ソースはこのへん?  あとファイル名必要な時どうするのかは知らない。(と思ったらここのソースになんか書いてある)</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/socketry/multipart-post/blob/master/lib/composite_io.rb#L75">https://github.com/socketry/multipart-post/blob/master/lib/composite_io.rb#L75</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14601 2018-11-14T03:32:24+09:00 2018-11-14T04:10:54+09:00 https://crieit.net/posts/Web-100 Web未経験から100日でリリース!「お笑いライブの検索サイト」をつくりました【個人開発】 <p>こんにちは、かしい(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/rubys8arks">@rubys8arks</a>)と申します。<br /> SIerで働いていましたが、WEB業界への転職を目指しプログラミングの勉強を始めました。<br /> データベースなどの知識は少しあったものの、Webアプリケーションの開発は今回が完全に初めてです!</p> <h1 id="作ったもの"><a href="#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE">作ったもの</a></h1> <p>お笑いライブの検索サイトです。日付やキーワードで東京近郊のお笑いライブを横断検索できます。<br /> - <a target="_blank" rel="nofollow noopener" href="https://warally.info">ワラリー! - お笑いライブ検索(東京)</a></p> <blockquote class="twitter-tweet" data-lang="fr"><p lang="ja" dir="ltr">🎊Web系未経験の初心者が100日間で初めてのrailsサービスをリリース🎊👉<a target="_blank" rel="nofollow noopener" href="https://t.co/qL6fAtOi5i">https://t.co/qL6fAtOi5i</a>首都圏のお笑いライブを日付やキーワードで横断検索できるサービスです!・5秒で使えるTwitterログイン・わかりやすいUI・13サイトからデータを毎日スクレイピングよかったら見てください〜✨ <a target="_blank" rel="nofollow noopener" href="https://t.co/7js7F9Bs8p">pic.twitter.com/7js7F9Bs8p</a></p>— かしい@お笑いSNSつくった (@rubys8arks) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/rubys8arks/status/1061748089751515137?ref_src=twsrc%5Etfw">11 novembre 2018</a></blockquote> <p><img width="337" alt="スクリーンショット 2018-11-13 18.58.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/068ccb8d-ab67-c558-9e04-b279ddb801ce.png"><img width="337" alt="スクリーンショット 2018-11-13 19.01.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/e9b5e0c0-51d7-29ed-ff64-c8305d9fd755.png"></p> <p>データはプレイガイドや劇場のサイトから自動でスクレイピングするほか、誰でもライブ情報を登録できるようになっています。</p> <p><img src="https://qiita-image-store.s3.amazonaws.com/0/238801/13926ae2-5133-570c-86ca-0901e79b055f.jpeg" alt="ワラリー!ビジネスモデル図.jpg" /><br /> * <a target="_blank" rel="nofollow noopener" href="https://note.mu/tck/n/n95812964bcbb?magazine_key=m91891e5390bc">ビジモ図鑑</a>で配布されているキットをお借りしました。</p> <h1 id="サービスを作ったきっかけ"><a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91">サービスを作ったきっかけ</a></h1> <p>もともと「Walive!」というお笑いライブの検索サイトがあったのですが、そのサイトが2017年9月で突然閉鎖してしまったことがきっかけです。<br /> せっかくお笑いファンの間で愛されているサイトだったのにもったいないなと思い、同じ機能(+α)を持った新しいサイトを作ろうと考えました。<br /> <img width="600" alt="スクリーンショット 2018-11-13 19.23.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/756b7047-435e-a639-0421-e4f4a4395b07.png"></p> <h1 id="どういう技術で動いてるか"><a href="#%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%8A%80%E8%A1%93%E3%81%A7%E5%8B%95%E3%81%84%E3%81%A6%E3%82%8B%E3%81%8B">どういう技術で動いてるか</a></h1> <p>初心者なのであまり凝った技術は使っていません!</p> <h2 id="バックエンド"><a href="#%E3%83%90%E3%83%83%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%89">バックエンド</a></h2> <h3 id="Ruby on Rails"><a href="#Ruby+on+Rails">Ruby on Rails</a></h3> <p>webスクレイピング用に<a target="_blank" rel="nofollow noopener" href="https://github.com/sparklemotion/mechanize">Mechanize</a>のgemを使ってます。サービス層は悪!と言われてることもあるのですが、コントローラーやモデルが見やすくなるのでサービス層、ヘルパー層も使いました。</p> <h2 id="サーバー"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC">サーバー</a></h2> <h3 id="Heroku"><a href="#Heroku">Heroku</a></h3> <p>手軽にデプロイできるHerokuのサーバーを使っています。<br /> アクセスできない時間ができるのが嫌だったので、Herokuの有料プランにしています。<br /> - Hobby Dyno $7/月 (システムダウンタイムなし、独自ドメインのかんたん設定)<br /> - Heroku Postgres Premium $9/月(1000万行まで保存できる)</p> <p>Herokuの有料プランは使わずにもっと安くする方法もあるみたいなんですが、一旦は設定のしやすさを優先しています。</p> <h2 id="フロントエンド"><a href="#%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89">フロントエンド</a></h2> <h3 id="JQuery"><a href="#JQuery">JQuery</a></h3> <p>さんざん「JQueryはオワコン」と言われていますが、ぐぐったときに出てくる情報が多いので一旦JQueryで実装しました。<br /> 日付の選択をカレンダ(<a target="_blank" rel="nofollow noopener" href="https://flatpickr.js.org/">flatpickr</a>)で行えるようにしたり、アンケート結果をアコーディオンでぬるっと表示させたりしています。<br /> <img width="339" alt="スクリーンショット 2018-11-13 19.32.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/a15b6af6-0ca5-398f-3a51-22a54bf96210.png"></p> <h3 id="fontawesome"><a href="#fontawesome">fontawesome</a></h3> <p>みんな大好き<a target="_blank" rel="nofollow noopener" href="https://fontawesome.com/">fontawesome</a>です。<br /> フォームのplaceholderにも使っています。</p> <h1 id="こだわったこと"><a href="#%E3%81%93%E3%81%A0%E3%82%8F%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">こだわったこと</a></h1> <h2 id="UIとデザイン"><a href="#UI%E3%81%A8%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3">UIとデザイン</a></h2> <p>「とにかく人に使ってほしい」という思いからUIとデザイン(特にライブの入力フォーム回り)にこだわりました。<br /> 実際にサービスへの反応も「デザインがいい!」というものが多く、ありがたい限りです。<br /> CSSのフレームワークは使わず、TumblrのEstenテーマ、Twitter、InstagramなどのSNSを参考にしました。<br /> <img width="312" alt="スクリーンショット 2018-11-13 20.32.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/a45d9e30-287d-a752-ee65-e7f4fbe33380.png"><img width="336" alt="スクリーンショット 2018-11-13 20.32.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/238801/3385c57f-2855-7b5e-5b60-a95cf021cc56.png"></p> <ul> <li>URLを貼り付けたらogp情報を取ってライブの説明や出演者、画像などを自動入力できるように</li> <li>会場をセレクトボックスで選択できるようにしつつ、自由入力欄も作ったり</li> <li>フォーム数が多くなると入力したくなくなるので、重要でない項目はモーダルで分けたり</li> </ul> <p>自分にとってはだいぶ使いやすくなったのですが、フォームはまだまだ改善の余地があるなと思っています。</p> <h2 id="SNSログイン"><a href="#SNS%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3">SNSログイン</a></h2> <p>お笑いファンはだいたいTwitterで情報収集しているので、既にアカウントを持っているであろうTwitterアカウントで登録・ログインできるようにしました。<br /> 知らないサービスにいきなり「メールアドレスで登録できます!」と言われてもユーザー登録しないなと思ったので、SNS連携としました。</p> <h2 id="いいね機能"><a href="#%E3%81%84%E3%81%84%E3%81%AD%E6%A9%9F%E8%83%BD">いいね機能</a></h2> <p>旧サイト「Walive!」にはなかった機能として、ライブへのいいね機能を2種類実装しました。<br /> ライブに行く人あるあるとして、自分のスケジュールを把握できずに同じ日の同じ時間帯のライブ(いわゆる『被り』)のチケットを間違えて買っちゃったりします。<br /> そういうのを防止したいなと思い、すでにチケットを買った・予約したライブは『絶対いく』、まだ買ってないけど行けたら行きたいライブは『気になる』で管理できるようにしました。</p> <h1 id="Webサービスをつくってみた感想"><a href="#Web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E6%84%9F%E6%83%B3">Webサービスをつくってみた感想</a></h1> <p>最初の1ヶ月はプログラミングスクールでhtml/cssとruby/Ruby on Railsを学んだのですが、スタッフの「1ヶ月ですぐ作れるよ!」という甘い声をうのみにして痛い目にあいました…。<br /> スクールを終えた知識で作ってみても「え、いいねボタン自動で切り替わらないの?(JQueryが必要)」、「孫モデルまでアソシエーションしてデータ取るのどうやるの?」などなどわからないことだらけ。<br /> 最初の頃、家で同じエラーに1週間くらいわんわん言ってた私に「macbookを買え、もくもく会に行け」と言いたいです。<br /> Twitter、Slack、もくもく会などでド初心者の質問に親切に答えてくださった皆さん、本当にありがとうございました!!</p> <p>エンジニアの方にはあまりお笑いライブに馴染みはないかもしれませんが、せっかく作ったのでちら見してもらえれば幸いです。<br /> 出演者ですぐ探せるので、「こないだテレビで見た芸人面白かったな」というときはぜひ使ってみてください!</p> <p><a target="_blank" rel="nofollow noopener" href="https://warally.info">ワラリー! - お笑いライブ検索(東京)</a></p> かしい@お笑いSNS作成中