20210901のRailsに関する記事は11件です。

rails tutorial4章進めた時の覚書

カスタムヘルパー Railsのビューでは膨大な数の組み込み関数が使えますが、それだけでなく、新しく作成することもできます。新しく作ったメソッドはカスタムヘルパー と呼ばれます 作り方 full_titleヘルパーを製作 helpers/application_helper.rb に、full_titleヘルパーを定義する。 module ApplicationHelper # ページごとの完全なタイトルを返します。 def full_title(page_title = '') base_title = "Ruby on Rails Tutorial Sample App" if page_title.empty? base_title else page_title + " | " + base_title end end end コンソールの中で何をしようとも、何かを壊すことはまずありえないので、ご安心ください。 いいことを聞いた '#{foo} bar' # シングルクォート内の文字列では式展開ができない => "\#{foo} bar" 文字列の入った変数同士を、間にスペースを入れて出力するには式展開を使って結合すると良い。 first_name = "Michael" last_name = "Moore" first_name + last_name ==> MichaelMoore # NG / 半角スペースが入らない "#{first_name} #{last_name}" ==> Michael Moore # OK / 半角スペースが入る Rubyでは、あらゆるものがオブジェクトです。文字列やnilですらオブジェクトです。 ほお。 「オブジェクトとは何であるか」という直感を養う Q. オブジェクトは何をするか? A. いついかなる時もメッセージに応答するもの >> "hello".length # helloという文字列(オブジェクト)に "length" というメッセージを送っている => 5 lengthがメソッド Rubyでは、メソッドがtrueまたはfalseという論理値(boolean)を返すことを、末尾の疑問符で示す慣習がある 面白いな。 >> "hello".empty? #helloは空ですか? => false # 違いますよ〜 >> "".empty? #""は空ですか? => true # せやで console内で、複数行にわたるコード書くにはどうするんだ? 複数行コピってconsoleに貼り付けてenterでいけた。 一行づつ叩いて行っても実行できた。 引数にデフォルト値を含める def string_message(str = '') #デフォルト値にからの文字列を設定 Rubyのメソッドは最後に評価された値が自動的に返される 引数の中の、 the_function_argumentは何だ... 引数に名前をつけてるようだ。 def string_message(the_function_argument = '') module ApplicationHelperとは? モジュールは、関連したメソッドをまとめる方法の1つ includeメソッドを使ってモジュールの読み込みができる(モジュールの読み込みをmixinと呼ぶ) Railsでは自動的にヘルパーモジュールを読み込むため、include行を書く必要がない 配列 配列から取り出すときに、-1を使うと末の値が取得できる。 number_array = [0, 1, 2] number_array[-1] => 2 配列が応答する様々なメソッド .empty? .include? .sort .reverse .shuffle 配列の内容を変更したい場合、破壊的メソッドを使う 破壊的メソッドは、下のメソッドの末尾に!を追加したものを使うのがRubyの慣習 a.sort! など。 配列に追加するときはpushメソッドを利用 << でも追加できる。 文字列を配列に変換する split メソッド 配列を文字列に変換する join メソッド >> a => [42, 8, 17, 6, 7, "foo", "bar"] >> a.join # 単純に連結する => "4281767foobar" >> a.join(', ') # カンマ+スペースを使って連結する => "42, 8, 17, 6, 7, foo, bar" # なん一回合体させたやつが、ちゃんと元の形で分割されるんや??? ブロック 1行の時{}使う (1..5).each { |i| puts 2 * i } 基本使うときは複数行 do end で囲む。 (1..5).each do |i| puts 2 * i end ハッシュ ハッシュは本質的には配列と同じだが、インデックスとして整数値以外を使えるのが配列と違う ハッシュは並び順が保証されない 要素の順序が重要ならば、配列を利用する キーと値のペアを波カッコで囲んで表記 キーと値のペアを持たない場合空のハッシュ user = {} #空のハッシュ user["first_name"] = "Michael" # キー: first_name, 値: Michael ハッシュの波カッコは、ブロックの波カッコとはまったく別物 []ではなく、 ハッシュロケットでリテラル表現すると簡単に記述できる ※リテラルとは: 数値や文字列など、データ型の値を直接記述できるように構文として定義されたもの。ちょっとよくわかってない #ハッシュロケット使わない user["first_name"] = "Michael" user["last_name"] = "Moore" #ハッシュロケット使用 user = { "first_name" => "Michael", "last_name" => "Moore" } シンボル Railsでは、ハッシュのキーを記述する際、文字列よりもシンボルを使う方が普通 シンボルは文字列と似ているが、クォーとで囲む代わりにコロンが前に置かれる点が違う Ruby以外ではごく一部の言語にしか採用されていない特殊なデータ形式 見慣れないな "name".split('') => ["n", "a", "m", "e"] >> :name.split('') #待って、これ入力すると上と同じ結果になってるんじゃないの??エラー出てるやん。 :name は、文字列 name として扱われるんとちゃいますの?? NoMethodError: undefined method `split' for :name:Symbol 何してる? stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' stylesheet_link_tagメソッドを、2つの引数で読んでいる 'application', media: 'all', data-turbolinks-track': 'reload' tabolinksはrailsの機能 クラスについて メソッドをまとめたものがクラス クラスからインスタンスが生成されることで、オブジェクトが作成される。 した二つは同じ s = "foobar" s = String.new("foobar") Rubyでは組み込みの基本クラスの拡張が可能 真に正当な理由がない限り、組み込みクラスにメソッドを追加することは無作法であると考えられています ユーザクラス Railsでは、インスタンス変数をコントローラ内で宣言するだけでビューで使えるようになる、といった点に主な利用価値があります インスタンス変数は常に@で始まる rubyの特殊なメソッド、 User.newを実行すると自動で呼び出されるメソッド このinitializeメソッドは、attributesという引数を一つとる def initialize(attributes = {}) @name = attributes[:name] @email = attributes[:email] end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails configファイルとは

configとは Configration(設定)という意味です。 Railsにおいては何かを設定する時に使うファイルです。 「config.パラメーター名 = 値」の形式で設定 configの中でよく使うもの 1 routes.rb ルーティングの設定でよく使われます。 ルーティングはurlみたいなものでどのコントローラーのどの処理をどのように処理を するのかを設定するものです。 2 webpack フロントエンドnoJavascriptなどの複数のモジュール(部品)をまとめるツールです。 3 application.rb アプリ全体の設定をする。 4 enviroment 環境ごとの設定ファイルを入れておくディレクトリです。 ・development.rb 開発環境の設定ファイルです。 ・test.rb テスト環境の設定ファイルです。 ・production.rb 本番環境の設定ファイルです。 5 initializer 初期化処理や設定情報を入れておくディレクトリです。 他にもlocalesやboot.rb,puma.rb,rubocop,database.ymlなどもあるので 調べてみてください。 ⚫︎参考資料 config https://railsdoc.com/config ⚫︎参考資料 webpack https://udemy.benesse.co.jp/development/system/webpack.html https://goworkship.com/magazine/how-to-webpack/#2
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WebpackerでHotReloadは動くが、コンパイル結果が反映されない

はじめに 最近は仕事でWebアプリケーションを作成しています。 本日もいつも通りWebページを作成し、Javascriptを書いたのですが、なぜかリロードしてもJavascriptが反応しませんでした。 色々調べたのですが、同じ現象の方がいなかったようなので、簡単にメモしていきます。 また、この解決に会社の上司の方が手助けをしてくれました。 タイトルも上司の方につけていただきました。 環境 Docker Desktop for Windows WSL2 VSCode 問題 Docker(WSL2)環境で以下の問題がいきなり発生しました。 ローカルとコンテナをマウントしている状態で、JavaScriptのファイルを編集しましたが、なぜか反映さません。 JavaScriptはwebpackerのコンテナをDockerで立ち上げて管理しています。 JavaScriptを編集した後に保存(Ctrl+s)をすると、ホットリロードが働いていることはターミナルから確認ができます。 そして、ターミナルではCompling....と走っていました。 しかし、変更内容が反映していません。 久しぶりにJavaScriptを書き、以前はこのような事象にはなりませんでした。 また、最近Hyper-VからWSLに環境を変更したので、それが問題化と思いましたが先輩の環境でも同じ事象になりました。 おそらく何かしらの設定がおかしいようでした。 また、時々コンテナの立ち上げの問題でWebページのスタイルがつかないことがあるのですが、今回はF5でリロードしてもスタイルがつくことがありませんでした。 始めにスタイルがついていないとそれ以降はつくことはありませんでした。 解決方法 以下の記事を確認して解決できました。 [Rails] Webpacker の使い方 webpacker/development.ymlの以下の箇所が問題になっていました。 webpack.yml # developmet cache_manifest: true この設定をいつ増やしたのかは忘れてしまいましたが、何かあって追加したのでしょう。 cache_manifestをtrueにすると初めにコンパイルした内容がCacheとして保存されるためそれ以降の変更が効かなくなります。これが原因でJavaScriptが反映されていませんでした。 以下のように修正します。 webpack.yml # development cache_manifest: false また、該当行を削除することで、デフォルトのfalseに設定されます。行ごと削除したほうがよいです。 おわりに かなり沼ってしまい、時間がかかってしまいました。 とりあえず原因特定としては別の環境で同じことを確かめたほうがいいと思いました。 詳細にコードを載せたいところでしたが手元に環境がないためメモ程度にまとめてみました。 明日からやっと仕事が再開できます。先輩ありがとうございました。 参考 [Rails] Webpacker の使い方
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】投稿カテゴリ機能(メモ)

目標 カテゴリ機能の実装 環境 Rails: 6.1.3 ruby: 3.0.0 mac: OS 前提 簡易的なTodoApp 投稿機能実装済 実装 categoryモデル作成 ターミナル $ rails g model Category name:string マイグレーションファイル生成。 class CreateCategories < ActiveRecord::Migration[6.1] def change create_table :categories do |t| t.string :name t.timestamps end end end $ rails db:migrate postテーブルにカテゴリカラムを追加 ターミナル $ rails g migration AddCategoryIdToPosts category_id: integer マイグレーションファイル生成。 class AddCategoryIdToPosts < ActiveRecord::Migration[6.1] def change add_column :posts, :category_id, :integer end end ターミナル $ rails db:migrate モデルの関連付け(アソシエーション) postは複数のカテゴリを持てるのでhas_many :categories app/models/post.rb class Post < ApplicationRecord has_many :categories カテゴリは1つの投稿に属しているのでbelongs_to :post app/models/category.rb class Category < ApplicationRecord belongs_to :post ルーティング記述 config.routes.rb Rails.application.routes.draw do resources :categories end categoryコントローラ作成 ターミナル $ rails g controller categories 生成されたコントローラに記述。 app/controllers/categories_controller.rb class CategoriesController < ApplicationController def index @categories = Category.all end def create @category = Category.new(category_params) @category.save end end private def category_params params.require(:category).permit(:name) end app/controllers/posts_controller.rb private def post_params params.require(:post).permit(:content, :title, :category_id) end ビュー記述 カテゴリを追加できるフォーム。 app/views/categories/new.html.erb <h2>カテゴリの追加 </h2> <%= form_with model: @category, local: true do |f| %> <div class='from_input'> <%= f.label :name %> <%= f.text_field :name %> </div> <div class="form_action"> <%= f.submit "登録する", class: "btn btn-primary" %> </div> <% end %> 追加したカテゴリを確認できます。 app/views/categories/index.html.erb <h1>カテゴリ一覧</h1> <table class="table table-hover"> <tbody> <% @categories.each do |cate| %> <tr> <td><%= link_to cate.name, posts_path(category_id: cate.id) %></td> <td><%= cate.created_at.to_s(:datetime_jp) %>作成</td> </tr> <% end %> </tbody> </table> 新しい投稿をする際にカテゴリを選択できるようにフォームに追記。 app/views/posts/new.html.erb <h2>投稿ページ</h2> <%= form_with model: @post do |f| %> <div class="form-input"> <%= f.label :title, 'タイトル' %> <%= f.text_field :title, class: "form-control" %> </div> <div class="form_input"> <%= f.label :content, '本文' %> <%= f.text_field :content, class: "form-control" %> </div> <div class="form_input"> <%= f.label :category_id %> <%= f.collection_select :category_id, Category.all, :id, :name, { prompt: '選択してください' }, class: 'form-control' %> </div> <div class="form_action row"> <%= f.submit "投稿する", class: "btn btn-primary"%> </div> <% end %> これでカテゴリが選択できます。 まとめ 今後も使う可能性のある機能だと思うので備忘録として残しておきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

今が特定の時間範囲内かどうやって判断する?(システム運休期間とか)(リファクタリング)

やりたいこと 現在時刻が特定の時間範囲内かどうかをスマートに判断したいです。 例えば、特定の時間帯、ユーザーグループごとシステムへのアクセスや一部機能を制限するのに使えるかと思います。 今日も弊社先輩のリファクタリングに息を呑んでしまったのでメモメモ。 Modelは例えばこんな感じ↓ 「利用一時停止」をsuspensionとしてその期間を持たせています。 # == Schema Information # # Table name: user_groups # # id :bigint not null, primary key # name :text not null # description :text # created_at :datetime not null # updated_at :datetime not null # suspension_started_at :datetime # suspension_ended_at :datetime 環境 ruby 3.0.0 Rails 6.0.3 実装! Ruby歴8ヶ月の人の実装例 def suspension? return if suspension_started_at.nil? || suspension_ended_at.nil? current_time = Time.current current_time >= suspension_started_at && current_time < suspension_ended_at end リファクタリング例 def suspension? return false if suspension_started_at.nil? || suspension_ended_at.nil? current_time = Time.current (suspension_started_at...suspension_ended_at).cover?(current_time) end 最終行の可読性がグッと上がった印象です。 ポイントを以下に3つまとめておきます。 ?で終わるメソッド 先輩から「?で終わるメソッドは毎回Booleanを返すべき」とレビューが返ってきました。それを読んだ僕は、「何をおっしゃいます。このメソッドの最終行はちゃんとtrue/falseを返しますよ?ふふ」と思ったら...あ、一行目が...!参りました!というわけで、return falseにしました。 範囲演算子... ...は範囲演算子で、x以上y未満という範囲オブジェクトクラスのインスタンスを生成することができます。ちなみに今回はドット2つだけど..も見かけるような?と思ったら、そちらは未満ではなく以下の意味になるそうです。下記、Rubyのリファレンスマニュアルから引用です。 Rubyリファレンスマニュアル Range.new(1, 5) # 1 以上 5 以下 1..5 # 同上 1...5 # 1 以上 5 未満 cover?メソッド cover?は、include?と似ていますが、違いがあるようで、上のコードをRspecテストの中で単純に置き換えてみるとテストはパスしますが、下記のような注意を受けました。 DEPRECATION WARNING: Using Range#include? to check the inclusion of a value in a date time range is deprecated. It is recommended to use Range#cover? instead of Range#include? to check the inclusion of a value in a date time range. (called from suspension? at /Users/kakudaisuke/.../app/models/user_group.rb:83) datetimeの範囲に値が含まれているかをチェックするにはinclude?は非推奨だよってことですね。ちなみに..にするとこのwarningは出現しませんでした。 cover?とinclude?両者の違いは、ドキュメントに書いてありました↓ Range#include? と異なり <=> メソッドによる演算により範囲内かどうかを判定します。 Range#include? は原則として離散値を扱い、 Range#cover? は連続値を扱います。(数値については、例外として Range#include? も連続的に扱います。) (Rubyリファレンスマニュアルより https://docs.ruby-lang.org/ja/latest/method/Range/i/cover=3f.html) 最後に 何かご指摘あれば、ぜひよろしくお願いします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsポートフォリオ【Tamari-Ba】についてまとめてみた

制作背景 友人とバイクでツーリングに行く際に、目的地までの道が重要なのだが道を紹介するサイトが少ない(もしくはバイク乗りなら誰でも知っているような内容しかなかった)という課題から、道やスポットを紹介し、道やスポットについて交流するWEBアプリを作ろうと考えました。 アプリ名 アプリ名: Tamari-Ba 「たまりば」と読みます。バイク乗り達が自分のバイク、好きな道、きつかった道、楽しかった道の駅等を語り合う「たまり場」をイメージして作成。 いつも行くあのカフェ、あの道の駅等の集まってダベれる「たまり場」のように好きなスポットについて語り合えるようなアプリに仕上げました。 ER図 インフラ構成図 ポートフォリオなので大きなアクセス負荷はかからないという見込みからコスト削減のためRDSは使わずに構築しました。 使用技術 フロントエンド HTML / CSS / Sass Bootstrap 4.5 バックエンド Ruby 2.7.2 Ruby on Rails 6.1.3 JavaScript GoogleMapsAPI(Maps JavaScript API / Geocoding API) インフラ MySQL 5.7 Nginx 1.20 Puma 5.3.2 AWS (VPC, EC2, S3) CircleCI Docker 20.10.8 Supervisor 機能一覧 ユーザー関連 機能 1 アカウント登録/削除機能 2 ログイン/ログアウト機能 3 ゲストログイン機能 4 アカウント情報編集機能 5 ユーザー情報 - 都道府県 6 ユーザー一覧 投稿機能 機能 1 投稿機能(CRUD) 2 GoogleMaps表示機能 3 マップ検索機能 4 座標取得/保存機能 5 マーカー設置機能 6 コメント機能 7 いいね機能 8 投稿検索 9 投稿一覧 できること 1. トップページ ログイン状態に応じて、リンクボタンを表示分けさせています。 非ログイン状態:ログイン/ゲストログイン ログイン状態:アプリトップ 最新3件分の投稿を表示 機能の概要を説明 投稿詳細イメージを表示 2. 新規投稿 マップの検索でマップ表示範囲を移動できます。 任意の箇所をクリックすることでマーカーを設置できます。 座標がデータベースに保存されます。 その他にも画像保存、タイトル、説明文を入力することが可能です。 3. 投稿一覧 投稿一覧を見ることができます。 検索機能があるので、投稿を検索することができます。 15投稿でページネーションが適用されます。 4. 投稿詳細 保存された座標を元に地図上にマーカーを表示します。 投稿者本人がログインしている場合には編集/削除ボタンが表示され実行できます。 保存された画像が表示されます。 コメント欄に入力して「コメントする」をクリックすることで、コメント可能です。 まとめ ポートフォリオとしてアウトプットすることで自分の実力がメキメキ付いてくるのを実感しました。 とはいえ、まだつけたい機能やフロント周りは改善の余地があるため転職活動を続けていく中で改善していこうと思います。 投稿記事 ポートフォリオ関連 ポートフォリオ作成に当たり、理解が難しかったもの、知識として足りないと思ったものに関しては記事にまとめています。 - 【GoogleMapsAPI】Rails6アプリにMapsJavaScript APIとGeocoding APIを導入してみた - MySQLが起動失敗による500エラーの解消 - 【Docker】Rails6/MySQLのコンテナを作って開発環境を構築 - 【Amazon Linux2】【Rails】Nginxをpumaのunixドメインソケットでリバースプロキシする設定 - 【CircleCI】AWSにデプロイしたRails6アプリをCircleCIで自動デプロイ - 【Rails6】rails sで起動できなくなった話 その他記事 以下は実案件受注やLT会の記事です。 - Rails6でStripe Checkoutを実装 (開発環境/TESTモード) - 【Ruby】変数と定数のあれこれ - 【SQL書籍勉強会】SQLとは? - 【SQL書籍勉強会】SQLの集計 - 【SQL書籍勉強会】テーブル設計
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rubocop-airbnbを使ってルール遵守の確認

目次 概要 導入方法 ファイルの作成・記載 指摘事項 総括 参考記事 概要 Rubocopとはコード解析・検査をしてくれるGemです。具体的にはコードに対して、一行が長いよ、endがないよといったことをあるルールに則り指摘(任せれば修正も)してくれます。 今回使用するRubocop-airbnbはデフォルトのルールではなく、Airbnb社が決めたルールで解析してくれるGemです。 Githubはこちら 尚、今回、私自身がPF制作を終えて、ある一定のルールの下、コーディング出来たのかということを確認するために導入しました。 そのためGemに任せた修正は行わず、一つ一つ内容を確認しました。 導入方法 Gemfile. group :development, :test do gem 'rubocop-airbnb' bundle installしましょう。 ファイルの作成・記載 アプリのフォルダ直下に.rubocop.ymlと.rubocop_airbnb.ymlを作成します。 /アプリ名/.rubocop.yml /アプリ名/.rubocop_airbnb.yml になっていればOKです。 rubocop.yml inherit_from: - .rubocop_airbnb.yml #解析から除外するファイルやフォルダを指定します。 #ご自身に合わせて加除修正を行ってください。 AllCops: Exclude: - 'db/**/*' - 'bin/*' - 'config/environments/*' - 'config/application.rb' - 'config/initializers/*' - 'config/spring.rb' - 'lib/tasks/*' - 'vendor/**/*' - 'path/ruby' - 'test/**/*' - 'spec/**/*' - 'config/**/*' rubocop_airbnb.yml require: - rubocop-airbnb これで記載完了です。 $ bundle exec rubocop --require rubocop-airbnb で検査できます。 指摘事項 約80か所の指摘がありましたがインデント、改行がメインでした。 文言通りに確認していくとすぐに解決することができますが、 パッと見て理解できなかったもの、解決に至らなかったものをご紹介したいと思います。 Freeze mutable objects assigned to constants. 参考 正規表現のバリデーションをかけた箇所への指摘。 定数を書き換えられないようにfreezeメソッドで固定せよとのこと。 /[ァ-ヴ]/.freeze こちらで解決 Inconsistent indentation detected. 一貫性のないインデントを検出したとのこと。不審な点が見当たらず未解決。 Use 2 (not 0) spaces for indentation. def index 類似事例を参考にするも未解決。 総括 企業やアプリケーション毎にコーディングルールがあり、それに準じて記載していく必要があるということは分かっていました。 自分なりにルールを設けて記載していたつもりでしたが、表記ゆれが確認できてしまいました。(Airbnb社とのルール差はともかく。) この点は反省し、今後一層コーディングルールの順守を心がけていこうと思います。 参考 https://qiita.com/yokoyan/items/76e6b330a6b9d908d6fb https://qiita.com/tomohiii/items/1a17018b5a48b8284a8b https://qiita.com/ki_87/items/c09f2c7b924669bb9600
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails serverした時に(ActiveRecord::ConnectionNotEstablished Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2))と出る時の対処法

 やりたいこと rails s時ブラウザに出るエラーを消したい ※この記事では、MacOS Xを使用しています。  問題 rails sしたら以下エラーがブラウザに表示 ActiveRecord::ConnectionNotEstablished Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)  原因 調べると ・mysql.sockファイルがない ・pidファイルがない ・pidファイルに適切な権限が設定されていない この3つを対処します ※mysql.sockを作成したらサーバー起動できる場合もあるようですが、私の場合は3つやって解決できました  解決策 mysql.sockがないので作成 $ sudo touch /tmp/mysql.sock mysql再起動 $ sudo mysql.server restart 今度はpidファイルがないと言われた $ sudo mysql.server restart  ERROR! MySQL server process #13658 is not running! Starting MySQL . ERROR! The server quit without updating PID file (/usr/local/var/mysql/****.pid). なのでpidファイル作成 ※****には マシンのホスト名 を入力。 ※ホスト名はuname -nで確認できます $ touch /usr/local/var/mysql/****.local.pid しても依然エラー  ERROR! MySQL server PID file could not be found! Starting MySQL . ERROR! The server quit without updating PID file (/usr/local/var/mysql/****.pid). ※念のためcdで /usr/local/var/mysqlまで移動しlsで確認 →pidファイルあった。なので原因は別 以下のコマンドで、/user/local/var/mysql以下のファイルの所有者をすべて_mysqlにする sudo chown -R _mysql:_mysql /usr/local/var/mysql/ すると username@**** mysql % sudo mysql.server restart  ERROR! MySQL server PID file could not be found! Starting MySQL .. SUCCESS!  なぜかnot foundですがいけました!!! 無事railsサーバー起動できました  参考記事 ・mysqlが起動できない(Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)) ・mysql 起動時のThe server quit without updating PID file エラーの回避法
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby on Rails】exists?とpresent?って何が違うの???

前置き ランキング機能を実装中 サーバー立ち上げたら下記の箇所で怒られた exists?じゃダメなの???? 適当に知っているメソッドを入れているとpresent?だと問題なく稼働した。理由がわからなかったので、2つのメソッドになんの違いがあるか調べてみた。 目的 2つの違いをはっきりさせる 1.結論 データベースからデータを取得する前か後かで違う データベースから取得した値が文字列か配列か又は存在するかで違う exists? データベースからデータを取得する前に、データが存在しているかどうか present? データベースからデータを取得した後、条件に該当したデータの存在を調べるとき 2. 原因 実際に初めに挙げた例では@today_ranksには配列でデータを渡していたので、present?で正常に稼働しました。 ranks_controller.rb def rank @today_post_ranks_user = Article.group(:user_id).where(created_at: Time.current.all_day).order('count(user_id) desc').limit(10).pluck(:user_id) # 今日投稿した記事 @today_ranks = [] @today_post_ranks_user.each do |user_id| @today_ranks.push({ "user" => User.find(user_id), "count" => Article.where(created_at: Time.current.all_day).where(user_id: user_id).count, }) end end ちなみに!blank?も同じ意味になり、正常に動きました。 参照 nil? empty? blank? present? exists? メソッドを状況に応じて使い分けよう[Rails] 投稿者コメント 適当に書いてたらなんか動いた じゃなくて、ここではこういう使い方があってこうだから動いたんだ! とちゃんと理由がわかるように勉強していきます! My Profile プログラミング学習歴3ヶ月目のアカウントです! プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。 また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。 もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker上にMySQLサーバー構築時につまずいたエラー

今回の経緯 Ruby on railsでバッチ処理を行うにあたって、Dockerをインストールしました。 DBはMySQLを使用し、MySQLのデータベースサーバーをDocker上に構築。 問題なく、環境構築を終えローカルPCからDockerのMySQLコンテナへ接続できるようにしました。 環境構築が完了し、いよいよRailsでテーブル作成。 マイグレーションファイルを編集後、データベースに反映させようとしたところ発生したエラーでした。 環境 ・Mac OS ・Rails 6.0.4.1 ・Docker 20.10.8 ・mysql2 0.5.3 エラー内容 % bin/rails db:migrate を実行したところ、以下のエラーが発生。 -- Crash Report log information -------------------------------------------- See Crash Report log file under the one of following: * ~/Library/Logs/DiagnosticReports * /Library/Logs/DiagnosticReports for more details. Don't forget to include the above Crash Report log file in bug reports. 〜中略〜 -- Control frame information ----------------------------------------------- c:0042 p:---- s:0236 e:000235 CFUNC :connect c:0041 p:0614 s:0224 e:000223 METHOD /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90 [FINISH] c:0040 p:---- s:0210 e:000209 CFUNC :new 〜中略〜 [NOTE] You may have encountered a bug in the Ruby interpreter or extension libraries. Bug reports are welcome. For details: https://www.ruby-lang.org/bugreport.html [IMPORTANT] Don't forget to include the Crash Report log file under DiagnosticReports directory in bug reports. 原因を調べてみると、MySQLのバージョンが原因なのではないかとのことでした。 その後バージョン変更のためにコマンドを実行するも、他のエラーが発生し、そのために再度別のコマンドを実行しの繰り返しでドツボにハマっていきました。 あれやこれやをやっていた矢先、最終的に以下のxcodeを再インストールを実施して出てしまったエラーに1番苦戦したかたちになってしまいました。 以下の3つのコマンドを実行し、xcodeを再インストールしました。 $ sudo rm -rf $(xcode-select -print-path) $ sudo rm -rf /Library/Developer/CommandLineTools $ xcode-select --install xcode再インストール完了後、 $ yarn install 1 error generated. make: *** [Release/obj.target/binding/src/binding.o] Error 1 gyp ERR! build error gyp ERR! stack Error: `make` failed with exit code: 2 gyp ERR! stack at ChildProcess.onExit (/Users/shigatakuma/projects/node_modules/@rails/webpacker/node_modules/node-gyp/lib/build.js:262:23) gyp ERR! stack at ChildProcess.emit (node:events:394:28) gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:290:12) gyp ERR! System Darwin 20.6.0 gyp ERR! command "/usr/local/Cellar/node/16.8.0/bin/node" "/Users/shigatakuma/projects/node_modules/@rails/webpacker/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library=" gyp ERR! cwd /Users/shigatakuma/projects/node_modules/@rails/webpacker/node_modules/node-sass gyp ERR! node -v v16.8.0 gyp ERR! node-gyp -v v3.8.0 gyp ERR! not ok 解決した方法 以下の3つのコマンドでMySQLの状況を調べます。 $ brew search mysql $ which mysql $ ps aux | grep mysql ↓実行結果 $ brew search mysql ==> Formulae automysqlbackup mysql-client@5.7 mysql@5.6 ✔ mysql ✔ mysql-connector-c++ mysql@5.7 mysql++ mysql-sandbox mysqltuner mysql-client mysql-search-replace qt-mysql ==> Casks homebrew/cask/mysql-connector-python homebrew/cask/navicat-for-mysql homebrew/cask/mysql-shell homebrew/cask/sqlpro-for-mysql homebrew/cask/mysql-utilities $ which mysql /usr/local/bin/mysql $ ps aux | grep mysql 1685 0.0 0.0 4920184 604 ?? S 20 821 1:24.21 /usr/local/opt/mysql@5.6/bin/mysqld --basedir=/usr/local/opt/mysql@5.6 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@5.6/lib/plugin --log-error=shigataumanoAir.err --pid-file=shigataumanoAir.pid 1566 0.0 0.0 4280140 4 ?? S 20 821 0:00.05 /bin/sh /usr/local/opt/mysql@5.6/bin/mysqld_safe --datadir=/usr/local/var/mysql 92976 0.0 0.0 4259000 220 s002 U+ 9:50AM 0:00.00 grep mysql 以上のコマンドから、 bundle installのときにMySQL5.6の設定を参照してgemがインストールされていることが原因と判明しました。 以下のコマンドでgem mysql2をアンインストールします。 $ bundle exec gem uninstall mysql2 さらにgemをインストールする際の設定を変更します。 $ bundle config --local build.mysql2 "--with-mysql-config=/usr/local/bin/mysql_config --with-ldflags=-L/usr/local/opt/openssl@1.1/lib --with-cppflags=-I/usr/local/opt/openssl@1.1/include" 再インストール後、rails db:migrateを実行します。 $ bundle install $  bin/rails db:migrate 今度は以下のエラー文が出力されました。 rails aborted! Mysql2::Error::ConnectionError: Access denied for user 'batch_user'@'localhost' (using password: YES) /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `initialize' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/connection_adapters/mysql2_adapter.rb:24:in `new' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/connection_adapters/mysql2_adapter.rb:24:in `mysql2_connection' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:887:in `new_connection' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:931:in `checkout_new_connection' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:910:in `try_to_checkout_new_connection' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:871:in `acquire_connection' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:593:in `checkout' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:437:in `connection' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:1125:in `retrieve_connection' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/connection_handling.rb:221:in `retrieve_connection' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/connection_handling.rb:189:in `connection' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/tasks/database_tasks.rb:238:in `migrate' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/railties/databases.rake:86:in `block (3 levels) in <main>' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/railties/databases.rake:84:in `each' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/activerecord-6.0.4.1/lib/active_record/railties/databases.rake:84:in `block (2 levels) in <main>' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/railties-6.0.4.1/lib/rails/commands/rake/rake_command.rb:23:in `block in perform' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/railties-6.0.4.1/lib/rails/commands/rake/rake_command.rb:20:in `perform' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/railties-6.0.4.1/lib/rails/command.rb:48:in `invoke' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/railties-6.0.4.1/lib/rails/commands.rb:18:in `<main>' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/bootsnap-1.8.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/bootsnap-1.8.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/bootsnap-1.8.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/bootsnap-1.8.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi' /Users/shigatakuma/projects/.bundle/ruby/2.6.0/gems/bootsnap-1.8.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require' bin/rails:4:in `<main>' Tasks: TOP => db:migrate (See full trace by running task with --trace) ローカルで起動しているMySQLへの接続が優先されているかもしれないとのこと。 docker-compose.ymlファイル内記載のポートを変更(3306 → 3307) version: '3.8' services: mysql: image: mysql:8.0 volumes: - ./tmp/mysql:/var/lib/mysql ports: # - 3306:3306 - 3307:3306 environment: - MYSQL_ROOT_PASSWORD=batch dockerの再起動 $ docker-compose down $ docker-compose up -d ここが重要ですが、MYSQL_PORTを指定してrails db:migrateを実行する必要があります。 $ MYSQL_PORT=3307 bin/rails db:migrate == 20210830030847 CreateUsers: migrating ====================================== -- create_table(:users, {:comment=>"ゲームのユーザー情報を管理するテーブル"}) -> 0.0742s == 20210830030847 CreateUsers: migrated (0.0743s) ============================= == 20210830030923 CreateUserScores: migrating ================================= -- create_table(:user_scores, {:comment=>"ユーザーがゲーム内で獲得した点数"}) -> 0.1328s == 20210830030923 CreateUserScores: migrated (0.1329s) ======================== == 20210830031004 CreateRanks: migrating ====================================== -- create_table(:ranks, {:comment=>"ゲーム内のランキング情報"}) -> 0.1475s == 20210830031004 CreateRanks: migrated (0.1476s) ============================= 上手くいきました!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[jQuery]ランキングしたものをslickで表現する

はじめに 本記事では、slickを用いた記述をいたします。 slickはjQueryベースのスライダーを作成するためのプラグインです。 コード いろんなサイトやYouTubeの動画を参考にしましたが、 CDNを使用するのが一番良いなという結論に至っています。 (ファイル保存とか色々グダってトラウマ) <!DOCTYPE html> <html> <head> 省略 <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick-theme.css"/> <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/> </head> <body> <%= yield %> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script> </body> </html> これだけです。 あと、gem 'jquery-rails'は予めbundle installしています。 以下長いのでランキングの部分だけ。 <h2 class="ranks-title">Ranking !</h2> <div class="ranks"> <% @ranks.each do |food| %> <div class="ranks-img-content"> <h2 class="food-post-user"> <%= link_to user_path(food.user_id) do %> <%= food.user.nickname %> <% end %> </h2> <%= link_to food_path(food) do %> <%= image_tag food.image, class: "food-img" if food.image.attached? %> <div class="food-img-info"> <h2 class="shop-name"> <%= food.shop_name%> </h2> <h2 class="food-name"> <%= food.food_name%> </h2> </div> <% end %> </div> <% end %> </div> <script type="text/javascript"> $(function() { $('.ranks').slick({ dots: true }); }); </script> ドットは付けたいなと思ったので、即記述しました。 矢印が画面外にいってしまっているので、明日調整しようと思います。 また、 scriptタグを一番下にして記述しましたが、まあまあ汚いコードだと思っています。 ここ含めてリファクタリングのこと考えないとな。 ランキングのことをお話ししているので、 コントローラーも記載します。 def index @foods = Food.order("created_at DESC") @like = Like.new @ranks = Food.find(Like.group(:food_id).order('count(food_id) desc').limit(5).pluck(:food_id)) end いいね数が多い順番で、上から5位までをとっています。 難点なのが、過去の投稿全てのランキングになってしまっているので、改善が必要。 1週間や1ヶ月にいいね獲得数ランキングにするのが一番ベスト。 考えます。 また、リファクタリングの点では、モデルに記載するのが良いですが、 出来上がったことの満足感で後回しにしてしまっています。 後々改善します。 終わりに 導入しましたが、プラグインは便利でかっこいいですね。 導入後、楽しくていっぱい遊んでしまいます。 矢印が画面外にいる点が気持ち悪いので、明日の目標です。 以下参考サイトです。 【Rails】 便利なpluckメソッドをマスターしよう! Railsで週間いいねランキングを作る! slickの公式サイト 【Rails】slickでスライドショーを表示させる slickの使い方からカスタマイズまで【スライダープラグイン決定版】 jQueryスライダープラグイン9選!スライドショーを手軽に作成 どこよりも詳しい万能スライダーjQueryプラグインslick.jsの使い方 【jQuery】一行でスライダーが動く!slickをご紹介! それでは、明日も頑張りましょう!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む