20210415のRailsに関する記事は19件です。

createアクションが動かない!【Ruby on rails】

はじめに Ruby on Rails チュートリアル(以下:レイチュー)をなんとか2周し終え、意気揚々とオリジナルサイトを作り始めましたが、序盤も序盤createアクションを押しても、ページに何も変化がないという状況になりました。 qiitaに投稿したことがなかったので投稿の仕方を確認する意味合いも込めて解決までの道のりを記していく。 環境 Rails6.0.3, macOS Catalina 10.15.7 何が起きた? ユーザー登録機能を実装しようとform_withで雛形を作りいざ登録ボタンを押しても画面に何も変化が起きませんでした。 new.html.erb <div class="row"> <div class="col-md-6 col-md-offset-3"> <%= form_with model: @user, url: sign_in_path, do |f| %> <%= f.label :name %> <%= f.text_field :name %> <%= f.label :email %> <%= f.email_field :email %> <%= f.label :password %> <%= f.password_field :password %> <%= f.label :password_confirmation, "Confirmation" %> <%= f.password_field :password_confirmation %> <%= f.submit "Create my account", class: "btn btn-primary" %> <% end %> </div> </div> コントローラルートなどを確認したが問題はなさそう。(いつものやつ) users.controller.rb class UsersController < ApplicationController def new @user = User.new end def create @user = User.new(user_params) if @user.save # 保存の成功をここで扱う。 redirect_to @user else render 'new' end end def show @user = User.find(params[:id]) end private def user_params params.require(:user).permit(:name, :email, :password, :password_confimation) end end 何があかんのや。。。 解決 そもそも登録ボタンを押した時にエラーすら出ず、ページにも変化がない為form_withに何か問題があるのではと仮定。 レイチューの登録の章を見ると 「local: true 」がform_withの中に入っていることを確認。 これを入れるとうまく反応するようになりました。 学び local: trueはなぜ入れるのか 結論から言うとform_withではデフォルトでAjax通信をしているので非同期通信になるとのこと。 この状態だと必要な箇所だけが更新されて、そうでないところはそのままの状態になってしまう。 ここにlocal: trueと引数を渡す事によって、通常のHTTPリクエストになり、ページ全体が返ってきてページがリロードされるのでうまく動いたと言うことです。 最後に レイチューをやっているだけでは躓かなかった箇所で躓いたのでやはり自分で作ってみると言うのは大事だと身をもって実感した。 qiitaの投稿は書いていく内に自分の考えを整理でき、何が分かっていないのかを浮き彫りにすることができるので、自分の勉強のためにも非常に良い。 人の役に立つような発信ができるよう精進していく。 参考 @kakudaisuke https://qiita.com/kakudaisuke/items/e032c7705db00e8081dc?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items 記事の書き方なども含めて参考にさせていただきました。 引用する時本人の許可いるのかしら? qiitaの使い方も勉強します。。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Bootstrap4 カルーセル (Carousel) が上手く動かない

背景 : Bootstrapマニュアルによると、以下をコピペすれば動くとのことだが、上手くいかない。 ruby:html.erb <div id="carouselExampleControls" class="carousel slide" data-ride="carousel"> <div class="carousel-inner"> <div class="carousel-item active"> <img class="d-block w-100" src=".../800x400?auto=yes&bg=777&fg=555&text=First slide" alt="First slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src=".../800x400?auto=yes&bg=666&fg=444&text=Second slide" alt="Second slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src=".../800x400?auto=yes&bg=555&fg=333&text=Third slide" alt="Third slide"> </div> </div> <a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-slide="prev"> <span class="carousel-control-prev-icon" aria-hidden="true"></span> <span class="sr-only">Previous</span> </a> <a class="carousel-control-next" href="#carouselExampleControls" role="button" data-slide="next"> <span class="carousel-control-next-icon" aria-hidden="true"></span> <span class="sr-only">Next</span> </a> </div> 解法 : 以下を先頭に足すと解決した <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ImageMagickインストールエラーについて

imagemagick installエラー発生 4月14日深夜1時ごろ 困りました。 % brew install imagemagick Updating Homebrew... ==> Auto-updated Homebrew! Updated 3 taps (heroku/brew, homebrew/core and homebrew/cask). ==> New Formulae brook go-boring moto phpbrew cadence-workflow haruhi-dl multitime pure crackpkcs kickstart mx smu dua-cli leaf-proxy net-tools spaceship enkits mapcidr organize-tool systemd epr minisat pcp zsh-vi-mode ==> Updated Formulae Updated 1357 formulae. ==> Renamed Formulae fcct -> butane ==> Deleted Formulae atlassian-cli ==> New Casks audacity fabfilter-simplon audius fabfilter-timeless battery-buddy fabfilter-twin chatterino fabfilter-volcano command-pad iconscout dingtalk-lite katrain fabfilter-micro nordlocker fabfilter-one nordpass fabfilter-pro-c northernspysoftware-colorpicker fabfilter-pro-ds offset-explorer fabfilter-pro-g old-school-runescape fabfilter-pro-l pop fabfilter-pro-mb runelite fabfilter-pro-q sonobus fabfilter-pro-r utterly fabfilter-saturn wxmacmolplt ==> Updated Casks Updated 834 casks. ==> Deleted Casks battery-guardian flash-player-debugger-npapi beatport-pro flash-player-debugger-ppapi craft flash-ppapi flash-npapi imazing-mini flash-player kafka-tool flash-player-debugger screen ==> Downloading https://homebrew.bintray.com/sqlite-3.35.4.big_sur.bottle.tar.gz -=O=# # # # curl: (22) The requested URL returned error: 404 Not Found Trying a mirror... ==> Downloading https://ghcr.io/v2/homebrew/core/sqlite-3.35.4.big_sur.bottle.ta ==> Downloading from https://github.com/-/v2/packages/container/package/homebrew #=#=# curl: (22) The requested URL returned error: 404 Error: Failed to download resource "sqlite" Download failed: https://ghcr.io/v2/homebrew/core/sqlite-3.35.4.big_sur.bottle.tar.gz エラー文 Error: Failed to download resource "sqlite" 本日もさらにエラー ==> Downloading https://ghcr.io/v2/homebrew/core/sqlite/manifests/3.35.4 ######################################################################## 100.0% ==> Downloading https://ghcr.io/v2/homebrew/core/sqlite/blobs/sha256:861dc044ea5 ==> Downloading from https://pkg-containers-az.githubusercontent.com/ghcr1/blobs ######################################################################## 100.0% Error: python@3.9: the bottle needs the Apple Command Line Tools to be installed. You can install them, if desired, with: xcode-select --install X-codeのインストールが求められたので 解決手順 ①Xcode Command Line Tools のアンインストール % sudo rm -rf /Library/Developer/CommandLineToolsをTerminalに入力して行ってください。 ②Xcode Command Line Tools の再インストール % xcode-select --installをTerminalに入力して行ってください。 ③Imagemagickをインストール brew install imagemagick (参考)アプリごとにインストールするものではなくpc本体にインストールして使うものは「brew install」を行う。 ちなみに先ほどのImagemagickはすでにpc本体に入っていたので ######################################################################## 100.0% Error: imagemagick 7.0.11-4 is already installed To upgrade to 7.0.11-7, run: brew upgrade imagemagick すでに入ってるよと言われました。 (参考2) 入っているGem/アプリを確認する コマンド  対象 ①bundle install rubyのgemやライブラリーのインストール ②brew install PC本体にインストール ①実行の場合% (gem listをterminalで実行すると) *** LOCAL GEMS *** actioncable (6.0.3.6, 6.0.3.5, 6.0.3.4, 6.0.3.2, 6.0.2.1, 6.0.0) actionmailbox (6.0.3.6, 6.0.3.5, 6.0.3.4, 6.0.3.2, 6.0.2.1, 6.0.0) actionmailer (6.0.3.6, 6.0.3.5, 6.0.3.4, 6.0.3.2, 6.0.2.1, 6.0.0) actionpack (6.0.3.6, 6.0.3.5, 6.0.3.4, 6.0.3.2, 6.0.2.1, 6.0.0) actiontext (6.0.3.6, 6.0.3.5, 6.0.3.4, 6.0.3.2, 6.0.2.1, 6.0.0) 入っているGemがリストアップ ②実行の場合(brew listをterminalで実行すると) ==> Formulae aom gettext icu4c libheif little-cms2 openjpeg readline x265 autoconf ghostscript ilmbase liblqr m4 openssl@1.1 ruby-build xmlto docbook glib imagemagick libomp mpdecimal pcre shared-mime-info xz docbook-xsl gnu-getopt jpeg libpng mysql@5.6 pkg-config sqlite yarn freetype heroku libde265 libtiff node python@3.9 tcl-tk gdbm heroku-node libffi libtool openexr rbenv webp ご参考まで 参考サイト:@taoki11111さん タイトル「Homebrewとbundleの違い」 https://qiita.com/taoki11111/items/f182105f0263595f3050
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails6】エラー対処法|Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:

RailsでDeviseのセッティング中にmigrationファイルを作成しrails db:migrate (またはrake db:migrate)を実行したところ以下エラーが発生した。これの対処法について。 /app # rails db:migrate rails aborted! StandardError: An error has occurred, this and all later migrations canceled: Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for: class AddConfirmableToDevise < ActiveRecord::Migration[4.2] 対処法 migrationファイルの継承したクラス名の末尾でRailsのバージョンを指定する必要がある。Rials6の場合は[6.0]を追記する。 例:20210415115443_migration_file.rb class AddConfirmableToDevise < ActiveRecord::Migration[6.0] 処理 end 再度、rails db:migrate を実行。 # rails db:migrate == 20210415115443 AddConfirmableToDevise: migrating =========================== -- add_column(:users, :confirmation_token, :string) -> 0.0048s -- add_column(:users, :confirmed_at, :datetime) -> 0.0023s -- add_column(:users, :confirmation_sent_at, :datetime) -> 0.0019s -- add_index(:users, :confirmation_token, {:unique=>true}) -> 0.0048s == 20210415115443 AddConfirmableToDevise: migrated (0.0214s) ================== 無事migrationが成功。 エラーの詳細 表示されたエラー内容を見ると Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for: class AddConfirmableToDevise < ActiveRecord::Migration[4.2] クラスActiveRecord::Migrationの直接の継承はサポートされていない。バージョンを指定してください。 例 class AddConfirmableToDevise < ActiveRecord::Migration[4.2] という記述が書いてある。 つまり、マイグレーションファイルでクラスを継承する場合は、バージョンの指定が必須ということ。 補足 なお、今回はdeviseにconfirmableモジュールを追加するため後からマイグレーションファイルを追加作成したが、初期の$ rails g devise モデル名で自動生成されたマイグレーションファイルにはきちんとバージョンが記載されている。 マイグレーションファイル class DeviseCreateモデル名複数形 < ActiveRecord::Migration[6.0] 処理 end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Rails での簡単な流れ(rails newから)

Railsでアプリ制作 何度も作るうちになんとなくわかってきたので、自分の学習記録として残しておきます。 勉強中のため、間違っている部分があれば教えてください。 rails newで必要なファイルを作成 Dangoというアプリ制作 terminal rails new Dango --skip-bundle Herokuでデプロイする時のことを考えて、 --skip-bundle オプションをつける つけないと、GemがPCのシステムにinstallされる (複数のアプリを作成する場合は指定しないとエラーの元となる) terminal cd Dango アプリのディレクトリへ移動 terminal bundle install --path vendor/bundle Railsで扱うGemを個々のアプリに分けて扱える アプリを作成する時はbundle install --path vendor/bundleでGemをインストールすることでアプリごとにGemを自動で切り替えてくれる 初めに開くページを作成(Top) URLをクリックしたあとに最初に表示されるページを作成する terminal rails g controller home top homeコントローラー作成 topアクション、それに対するview、routes.rbにget home/topができる app/config/routes.rb get 'home/top' < 削除 > root to: 'home#top' < 追記 > root to: 'home#top'に書き換える top.html.erb <h1>このページはルート</>設定しているのでURLの最初のページです</h1> 分かりやすいように書き直しました。書き直さなくても大丈夫です。 terminal rails s rails sで動作確認 Webページ上 このページはルート</>設定しているのでURLの最初のページです が表示されていればOK Question モデル作成 terminal rails g model Question title:string body:text Questionは単数にすること それぞれのデータがあるため、一つ一つという意味らしい terminal rails db:migrate これをしないとデータベースが作成されない しないとエラーになる Questionコントローラー作成 一覧ページ index 詳細ページ show 作成ページ new 保存アクション create 編集ページ edit 更新アクション update 削除アクション destroy question controller作成 terminal rails g controller questions index show new edit questionsは複数にすること Questionコントローラー作成 保存、更新、削除は画面には表示する必要がないため、後で直接コントローラー内に追記する。 保存、更新、保存はデーターベースの変更のためそのページを表示するのではなく、データーベースを変更する処理のみでよい routes.rb変更 app/config/routes.rb root to: 'home#top' resources :questions < 追記 > index questions_controller.rb class QuestionsController < ApplicationController < 追記 > def index @questions = Question.all end end index.html.erb <h1>ここはQuestion indexのページです</h1> <ul> <% @questions.each do |q| %> <li><%= q.title %></li> <li><%= q.body %></li> <% end %> </ul> <%= q.title %> <%= q.body %> で表示できる show questions_controller.rb class QuestionsController < ApplicationController < 追記 > def show @question = Question.find(params[:id) end end show.htnl.erb <h1>ここはQuestion showのページです</h1> <table> <thead> <tr> <td>Title</td> <td>Body</td> </tr> </thead> <tbody> <tr> <td><%= @question.title %></td> <td><%= @question.body %></td> </tr> </tbody> </table> <%= @question.title %> <%= @question.body %> で表示できる new & edit questions_controller.rb class QuestionsController < ApplicationController < 追記 > def new @question = Question.new end def create @question = Question.new(question_params) if @question.save flash[:notice] = 'Question was successfully created.' redirect_to question_path(@question) else render 'new' end end def edit @question = Question.find(params[:id]) end def update @question = Question.find(params[:id]) if @Question.update(question_params) flash[:notice] = 'Question was successfully updated.' redirect_to question_path(@question) else render 'edit' end end private def question_params params.require(:question).permit(:title, :body) end end private以下のquestion_paramsはストロングパラメーターといい安全なデータかを検証してくれるものです create, updateで失敗したらrenderでそれぞれnewとeditのフォームを表示するようにしています。 new editについてはフォームヘルパーというものを利用する _form.html.erbというものを作成することでコードが見やすくなる _form.html.erbを作成する _form.html.erb <%= form_for @question do |f| %> <label>Title</label> <p> <%= f.text_field :title %> </p> <label>Question</label> <p> <%= f.text_area :body %> </p> <p> <%= f.submit %> </p> <% end %> new.html.erbとedit.html.erbについて以下のようにする new.html.erb <h1>ここはQuestion newのページです</h1> <%= render 'form' %> edit.html.erb <h1>ここはQuestion editのページです</h1> <%= render 'form' %> <%= render 'form' %>とすることで_form.html.erbのviewがrenderされて表示される renderとはviewを表示したい時に使用される validatesを設定する 質問投稿ができても、それが必ず文字で埋まってるという可能性は少ない。そこであらかじめ、空の文字を保存できないように設定することができる。 ここで説明するのは基本的なものなのでrails validatesなどと調べることで色々出てきます。 app/models/question.rb class Question < ApplicationRecord validates :title, presence: true < 追記 > validates :body, presence: true < 追記 > end validatesに失敗した時のエラーメッセージ表示 _form.html.erbに以下追記 _form.html.erb <%= form_for @question do |f| %> ------------ここから------------- <% if @question && @question.errors.any? %> <%= @question.errors.count %>errors prohibited this obj from being saved:<br> <ul> <% @question.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> <% end %> ------------ここまで------------- <label>Title</label> <p> <%= f.text_field :title %> </p> <label>Body</label> <p> <%= f.text_area :body %> </p> <p> <%= f.submit %> </p> <% end %> 今回は、rails newからquestions controller、question modelまでを紹介しました。 今後は、ユーザー登録、紐付けなど自分が整理出来次第投稿します。 勉強中のため、説明や記述など間違いがありましたら教えてください。 今後したいこと herokuデプロイ紹介 gem 'devise'関連 紐付け関連
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rbenvの簡単な備忘録

rbenvとは 複数のRubyのバージョンを管理し、プロジェクトごとにRubyのバージョンを指定して使うことを可能としてくれるツールです。 引用:rbenvでRubyを管理し、Rails開発環境を構築する つまりrbenvをインストールしていれば自分のPCのRubyのバージョンを簡単に切り替えることが出来るようになります。 1つだけ注意 互換性に関する注意:rbenvはRVMと互換性がありません。rbenvをインストールする前に、必ずRVMを完全にアンインストールし、シェル初期化ファイルからRVMへの参照を削除してください とのことです。(GitHub公式より引用) GitHub公式 各コマンド一覧 macOSを使用している場合はHomebrewを使用したインストールがオススメです。 ・rbenvのインストール brew install rbenv ・バージョンの確認 rbenv -v ・インストール可能な最新の安定バージョンだけを表示 rbenv install -l ・インストール可能なすべてのローカルバージョンを表示 rbenv install -L ・Rubyバージョンを指定してインストール rbenv install x.x.x(バージョンの番号を指定) ・現在設定中のバージョンの確認 rbenv version ・rbenvで管理しているインストール済みのRubyのバージョンを表示 rbenv versions ・デフォルトのRubyのバージョンを指定 rbenv global x.x.x(バージョンの番号を指定) ・そのディレクトリ以下で適用されるRubyのローカルバージョンを指定(グローバルより優先) rbenv local x.x.x(バージョンの番号を指定) ・ローカルバージョンの解除 rbenv local --unset ・新しいバージョンのRubyをインストールした後、またはコマンドを提供するgemをインストールした後に実行するコマンド rbenv rehash rbenv rehashについての詳細は以下の参考ページにて 【参考リンク】 ・rbenv rehashをちゃんと理解する ・rbenv rehashは何をやっているのか? ・rbenvの使い方と仕組みについて 参考サイト ・rbenvでRubyを管理し、Rails開発環境を構築する ・rbenvの使い方と仕組みについて
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails6] Heroku上でCarrierwave(Rmagick) + fogを使いAWS S3にファイルをアップロードする

最初に HerokuでRailサイトを作る時ストレージを別途用意しなければなりません。 Herokuでは時間が立つとアップロードした画像ファイルなどが消えてしまうので 今回は対応策としてAWS S3を使います。 S3とAWSのアカウントは作成した前提ですのでまだ済んでいない方は以下を参照ください S3の設定 AWSアカウントの作成方法 環境 Ruby 2.6.6 Rails 6.0.3.6 AWS S3の設定済 Rmagick設定済 Gem Gemは以下を使います gem "rmagick" gem "carrierwave" gem "fog-aws" モデル作成 画像をアップロードするモデルを作ります。 今回はユーザーに持たせるプロフィール画像を想定して作ります。 $ rails g model User name:string image:string $ rails db:migrate Uploaderの設定 Uploaderクラスを作成します。 (Imageの所は好きに置き換えてください) rails g uploader Image 作成されたらimage_uploder.rbに以下を追加します。 app/uploaders/image_uploader.rb include CarrierWave::RMagick if Rails.env.production? storage :fog        # 本番時にS3にファイルを保存する else storage :file # 開発・テスト時にはローカルにファイルを保存する end モデルとImageUploaderを関連付けるためにモデルに以下を追加します app/models/user.rb class User < ApplicationRecord mount_uploader :image, ImageUploader end CarrierWaveの設定 Herokuで画像の保存先をAmazon S3に保存できるように設定する config/initializers/carrierwave.rb require 'carrierwave/storage/abstract' require 'carrierwave/storage/file' require 'carrierwave/storage/fog' CarrierWave.configure do |config| if Rails.env.production? config.fog_provider = 'fog/aws' config.fog_credentials = { provider: 'AWS', aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'], #awsのIAMのアクセスキー aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], #awsのIAMのシークレットアクセスキー region: 'ap-northeast-1' #バケットの作成で設定した地域(東京で設定した場合は左と一緒) } config.fog_directory = "ENV['AWS_BUCKET_NAME']" #バケット名 config.cache_storage = :fog # 本番時はS3にファイルを保存する else config.storage = :file # 開発・テスト時はローカルにファイルを保存する end end Herokuへの環境変数登録 $ heroku config:set AWS_ACCESS_KEY_ID="IAMのAccess key IDを入力" $ heroku config:set AWS_SECRET_ACCESS_KEY="IAMのSecret access keyを入力" $ heroku config:set AWS_S3_BUCKET="S3のバケット名を入力" Herokuの環境変数の確認方法 $ heroku config 以上でHerokuにデプロイ後、画像を投稿してS3にバケット保存できました。 これで反映されない時はIAMのアクセスキーを再度発行して改めて環境変数を設定すると上手くいく場合もあるようです。 また今回は設定に1日中かかり、かなり試行錯誤して上手く実装することができました。 たくさん記事を見ましたので上手くいかない方は私が参照した記事も合わせて確認していただければと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

# エラー : [Autoprefixer doesn’t support Node v8.10.0. Update it.] が表示される.

背景 「Railsチュートリアル」ではBootstrap3を利用しているが、これをBootstrap4に変更したところ、上記のエラーが発生した。 原因 AutoprefixerというGemがNode.jsのversion 8.10.0を受け付けていないため、アップデートが必要とのこと。 解法 [mini-racer]というGemを追加する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【RSpec】Active Hashを用いたカテゴリーでテストをパスする方法

https://teratail.com/questions/275207 結論この記事 今回は、active hashを用いたカテゴリーの際に、テストがパスしずらい問題を解決していきます 詳しくいうと、 コントローラーの単体テストで、 it 'showアクションにリクエストすると,そのコーヒーの産地が表示' do get drink_path(@drink) expect(response.body).to include('マルチリージョン') end このようなテストがパスできなかったです。 期待する動作としては、 この画像の右部分に, 「産地 マルチリージョン」 とあるので、上記のようなテストを書きましたが、 drinks/show.html.erb <% if @drink.region %> <th class="region-title">産地 </th> <td class="region-name"><%= @drink.region.name%> </td> <% end %> @drinks.region.name には、「マルチリージョン」という文字が入って欲しかったのですが、 上記のテストを実行した結果、 Drinks GET #show showアクションにリクエストすると,そのコーヒーの産地が表示 Failure/Error: expect(response.body).to include('マルチリージョン') expected "\n<!DOCTYPE html>\n<html>\n <head>\n <title>Details | Coffee Passport</title>\n \n \n\n ...script src=\"/packs-test/js/footer-c1b52f0e268f9a453b2e.js\"></script>\n \n </body>\n</html>\n\n" to include "マルチリージョン" Diff: 中略 + <tr class="item-region"> + <th class="region-title">産地 </th> + <td class="region-name"> </td> + </tr> このようなHTMLが返され、 <td class="region-name"> </td> ここに @drink.region.nameが入るはずですが、 何も入ってなかったので、色々試しました。 色々試した結果は、「teratailに質問しようとした文」の部分に色々書いてあります。 該当のコード drinks/show.html.erb <% if @drink.region %> <th class="region-title">産地 </th> <td class="region-name"><%= @drink.region.name%> </td> <% end %> models/region.rb class Region < ActiveHash::Base self.data = [ { id: 1, name: '---'}, { id: 2, name: 'マルチリージョン' }, { id: 3, name: 'ラテンアメリカ' }, { id: 4, name: 'アフリカ' }, { id: 5, name: 'アジア、太平洋' } ] end factories/drinks.rb FactoryBot.define do factory :drink do name {"TOKYOロースト"} price {350} explain {"これはコーヒーの説明です"} region_id {2} このようなactive hashを用いた構成の場合に、しっかり<%= @drink.region.name%> が表示されてるか確かめたいので、 spec/requests/drinks_spec.rb it 'showアクションにリクエストすると,そのコーヒーの産地が表示' do get drink_path(@drink) expect(response.body).to include('マルチリージョン') end と、テストを書いた。 しかし、これだと、先ほど説明した通りに上手くいかない spec/requests/drinks_spec.rb require 'rails_helper' # bundle exec rspec spec/requests/tweets_spec.rb RSpec.describe "Drinks", type: :request do before do @user = FactoryBot.create(:user) region_id = Region.find_by(name: 'マルチリージョン').id body_id = Body.find_by(name: "LIGHT(軽い)").id acidity_id = Acidity.find_by(name: "LOW(少ない)").id processing_id = Processing.find_by(name: "WASHED(水洗式)").id @drink = FactoryBot.create(:drink, name: "TOKYOロースト", price: 350, explain: "これはコーヒーの説明です", region_id: region_id, body_id: body_id, acidity_id: acidity_id, processing_id: processing_id) 結論このように書けば上手くいく models/region.rb class Region < ActiveHash::Base self.data = [ { id: 1, name: '---'}, { id: 2, name: 'マルチリージョン' }, { id: 3, name: 'ラテンアメリカ' }, { id: 4, name: 'アフリカ' }, { id: 5, name: 'アジア、太平洋' } ] end spec/requests/drinks_spec.rb region_id = Region.find_by(name: 'マルチリージョン').id @drink = FactoryBot.create(:drink, name: "TOKYOロースト", price: 350, explain: "これはコーヒーの説明です", region_id: region_id, これで、うまいこと取得できて、テストをパスできる 多分これは冗長で、ベストプラクティスではないような気がするので、プロのRubistの皆さんにご意見をお伺いしたいと思うので、それを追記していきます。 teratailに質問しようとした文 このアプリのgithub 起きてる問題点はこれに近いです 発生している問題・エラーメッセージ Drinks GET #show showアクションにリクエストすると,そのコーヒーの産地が表示 Failure/Error: expect(response.body).to include('マルチリージョン') expected "\n<!DOCTYPE html>\n<html>\n <head>\n <title>Details | Coffee Passport</title>\n \n \n\n ...script src=\"/packs-test/js/footer-c1b52f0e268f9a453b2e.js\"></script>\n \n </body>\n</html>\n\n" to include "マルチリージョン" Diff: 中略 + <tr class="item-region"> + <th class="region-title">産地 </th> + <td class="region-name"> </td> + </tr> <td class="region-name"> </td> ここに、コーヒーの産地が表示されるはずですが、テストで返されたHTMLには表示されてないので、テストがパスできません。 原因は、 この画像の、この投稿の産地の部分の「マルチリージョン」とか 、コクの「LIGHT(軽い)」の部分とかが、上手く表示されてないです。 該当のソースコード drinks/show.html <% if @drink.region %> <th class="region-title">産地 </th> <td class="region-name"><%= @drink.region.name%> </td> <% end %> と、こんな感じで、drinks/showでは、 その投稿の産地の名前が表示される仕様になっています region.rb class Region < ActiveHash::Base self.data = [ { id: 1, name: '---'}, { id: 2, name: 'マルチリージョン' }, { id: 3, name: 'ラテンアメリカ' }, { id: 4, name: 'アフリカ' }, { id: 5, name: 'アジア、太平洋' } ] end ここで、Active Hashを用いてることが原因となっております drinks_spec.rb it 'showアクションにリクエストすると,そのコーヒーの産地が表示' do get drink_path(@drink) expect(response.body).to include('マルチリージョン') end spec/factories/drinks.rb FactoryBot.define do factory :drink do name {"TOKYOロースト"} price {350} explain {"これはコーヒーの説明です"} region_id {Region.all.sample} body_id {Body.all.sample} acidity_id {Acidity.all.sample} processing_id {Processing.all.sample} likes_count {2} association :user association :region association :body association :acidity association :processing after(:build) do |drink| drink.image.attach(io: File.open('app/assets/images/ethiopia.jpg'), filename: 'ethiopia.jpg') end end end spec/factories/regions.rb FactoryBot.define do factory :region do end end 試したこと この二つの記事を参考にして、 まず、factorybot同士でアソシエーションを組んでないから、@drink.region.nameが表示されないと思って、 spec/factories/regions.rb FactoryBot.define do factory :region do association :drink end end と記述したら 死ぬほど長いエラーが表示され、SystemStackError stack level too deep こんな感じのエラーが出ました。 次に app/models/region.rb class Region < ActiveHash::Base self.data = [ { id: 1, name: '---'}, { id: 2, name: 'マルチリージョン' }, { id: 3, name: 'ラテンアメリカ' }, { id: 4, name: 'アフリカ' }, { id: 5, name: 'アジア、太平洋' } ] + include ActiveHash::Associations + has_many :drink end このように記述しました 一番最初のエラーと変わりませんでした。 factories/region.rb FactoryBot.define do factory :region do 2 {'マルチリージョン'} end end このように記述したら SyntaxError: /coffee_passport/spec/factories/regions.rb:3: syntax error, unexpected '{', expecting end 2 {'マルチリージョン'} ^ このようなエラーになりました。 factores/drinks.rb に region_id {Region.second} このように記述しなおしたら Failure/Error: region_id {Region.second} NoMethodError: undefined method `second' for Region:Class Did you mean? send とエラーが表示されました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RSpec単体テストコードのexpected [] to includeの解決方法

RSpec単体テストコードのときたまにこのようなエラーを起こしてしまうことがある。 ターミナル Failures: 1) ShippingAddress 配送先の情報として、郵便番号が必須であること Failure/Error: expect(@userpurchases.errors.full_messages). to include ("Post code can't be blank") expected [] to include "Post code can't be blank" # ./spec/models/shipping_address_spec.rb:12:in `block (2 levels) in <top (required)>' 2) ShippingAddress 配送先の情報として、都道府県が必須であること Failure/Error: expect(@userpurchases.errors.full_messages). to include ("Prefecture_id can't be blank") expected [] to include "Prefecture_id can't be blank" # ./spec/models/shipping_address_spec.rb:18:in `block (2 levels) in <top (required)>' 3) ShippingAddress 配送先の情報として、市区町村が必須であること Failure/Error: expect(@userpurchases.errors.full_messages). to include ("Municipality can't be blank") expected [] to include "Municipality can't be blank" # ./spec/models/shipping_address_spec.rb:23:in `block (2 levels) in <top (required)>' 4) ShippingAddress 配送先の情報として、番地が必須であること Failure/Error: expect(@userpurchases.errors.full_messages). to include ("Address can't be blank") expected [] to include "Address can't be blank" # ./spec/models/shipping_address_spec.rb:28:in `block (2 levels) in <top (required)>' 5) ShippingAddress 配送先の情報として、電話番号が必須であること Failure/Error: expect(@userpurchases.errors.full_messages). to include ("Phone_number can't be blank") expected [] to include "Phone_number can't be blank" # ./spec/models/shipping_address_spec.rb:33:in `block (2 levels) in <top (required)>' expected[]to includeというエラーが出ており要するにうまくデータを持ってこれていない。 原因としてはdescribeの記述や各exampleのモデル名が間違っている可能性がある。 単体テストコードはモデルファイルのバリデーションがうまく機能しているかどうかのテストなのでモデルファイルと同じ記述にする必要がある。 RSpec.describe UserPurchases, type: :model do before do @user_purchases = FactoryBot.build(:user_purchases) end it '配送先の情報として、郵便番号が必須であること' do @user_purchases.post_code = nil @user_purchases.valid? expect(@user_purchases.errors.full_messages). to include ("Post code can't be blank") end it '配送先の情報として、都道府県が必須であること' do @user_purchases.prefecture_id = 0 @user_purchases.valid? expect(@user_purchases.errors.full_messages). to include ("Address is invalid. Include hyphen(-)") end it '配送先の情報として、市区町村が必須であること' do @user_purchases.municipality = nil @user_purchases.valid? expect(@user_purchases.errors.full_messages). to include ("Municipality can't be blank") end it '配送先の情報として、番地が必須であること' do @user_purchases.address = nil @user_purchases.valid? expect(@user_purchases.errors.full_messages). to include ("Address can't be blank") end it '配送先の情報として、電話番号が必須であること' do @user_purchases.phone_number = nil @user_purchases.valid? expect(@user_purchases.errors.full_messages). to include ( "Phone number can't be blank") この場合テストしたいモデルファイル名はuser_purchases.rbなので RSpec.describe UserPurchasesとし、 モデル名を@user_purchasesに変更した。 データを取れていない場合は大抵このような理由が多いようだ。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails cでカラムの値を確認するときに見やすくする方法

rails c で データを確認するときに each文を使って、カラムの値を見やすくする方法。 前提 memberテーブルのnameカラムの値を確認したい場合 rails cの起動 $ rails c Running via Spring preloader in process 10332 Loading development environment (Rails 5.2.4.5) [1] pry(main)> Member.all.each do |m| [1] pry(main)* p m.name # pでeachで渡されたものを表示して改行する [1] pry(main)* end こうすることで Member Load (0.2ms) SELECT "members".* FROM "members" "サンプル" "さんぷる" "sample" "てすと" "ゲスト" 縦に表示されて見やすくなった!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

herokuエラー H12:Request timeout

開発途中でHerokuでデプロイしたwebアプリを確認中に出てきたエラーに関してです。 画像つきで投稿機能があるアプリで、画像一覧が表記されずにこのエラーが発生しました。WiFiの調子が悪かったりなどもあり、はっきりとした原因はわかりませんでしたが、解決しました。 結果 AWSのS3を利用して画像を管理することで解決しました。 画像1つは1MB程度ですが、一覧で十数枚が一度に出てくる画面だったので、WiFiの環境も影響してリクエストタイムアウトが出たものと思います。 S3の設定方法に関しては公式ページ(下記参照)をご確認ください。※後日まとめてアップ予定です 何が起きたのか デプロイ済の対象ページへ遷移しようとした際になかなか繋がらず、 Application error An error occurred in the application and your page could not be served. If you are the application owner, check your logs for details. You can do this from the Heroku CLI with the command と表記が出てきました。 確かに長いこと読み込んでいたので、おかしいとは思いましたが、、 ここで指示にある[check your logs for details]通りに、herokuのエラーログを確認しました。 エラーログの確認はアプリのターミナルで heroku logs --tail を実行し確認したところ、長いエラー文の中より heroku[router]: at=error code=H12 desc="Request timeout" という文を見つけました。 パっと見た感じでも、どうやら時間がオーバーの様子。 Herokuのエラーコード(下記参照)にて確認してみると 30秒を超えると強制終了されるそう。 Heroku によって処理される Web リクエストは、いくつかの Heroku ルーター を経由して dyno に転送されます。これらのリクエストは、アプリケーションですぐに処理されることになっています。ベストプラクティスは、Web アプリケーションの応答時間を 500 ミリ秒未満にすることで、これによりアプリケーションが解放されてさらに多くのリクエストを受けられるようになり、訪問者に対して高品質のユーザーエクスペリエンスを提供できます。たまに Web リクエストが異常停止したり、アプリケーションによる処理に非常に時間がかかったりすることがあります。このような場合、完了までにかかる時間が 30 秒を超えると、ルーターはリクエストを強制終了します。 また、サイズの大きいファイルはアップロードが原因である可能性が書かれていましたので、下記の通りS3を利用しました。 多くの Web アプリケーションではユーザーがファイルをアップロードできます。これらのファイルのサイズが大きかったり、ユーザーのインターネット接続が遅い場合、アップロードにかかる時間が 30 秒を超えることがあります。リクエストをブロックする一部の種類の Web アプリケーションでは、これにより H12 リクエストタイムアウトが発生することがあります。これについては、 S3 に直接アップロードする ことをお勧めします。 サイズの大きいファイルとは4MBを超える可能性のあるアップロードだそうです。今回はそこまで大きくないはずですが、トータルの大きさでしょうか(知識不足すみません。。) 直接アップロードでは、ファイルは最初にアプリを経由せずに、ユーザーのブラウザーからS3バケットにアップロードされます。この方法は、サイズが4MBを超える可能性のあるユーザーのアップロードに推奨されます。 上記により問題なく表示はされるようになりました。 が、時々遅いことがあるので少し不安はありますが。。 何かわかれば追記させていただきます。 参照リンク AWS公式リンク https://aws.amazon.com/jp/ エラーコード一覧 https://devcenter.heroku.com/ja/articles/error-codes リクエストタイムアウト詳細 https://devcenter.heroku.com/ja/articles/request-timeout AWSS3を使用して静的アセットとファイルアップロードを保存する https://devcenter.heroku.com/articles/s3#direct-upload
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mysql2::Error: Specified key was too long; max key length is 767 bytesに遭遇した

 私がやった対処等 ①config/database.ymlのencoding:utf8mb4部分の修正 utf8mb4⇨utf8に変更 ②(私はこの段階で既にrails db:createしていたためでまだ組み始めたばかりだったため)一旦、rails db:dropでデータベース消去 ③ $ rails db:create $ rails db:migrate の順で復旧
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】formオブジェクトを用いてフロントエンドにjson形式でレスポンスを返す

React × Rails SPAの作成にあたりformオブジェクトを用いた実装をする必要があった。その際のレスポンスの返し方についてまとめておきます。 HTMLを返すだけなら苦労しない。 普通formオブジェクトでは以下の流れでデータを扱う コントローラーでストロングパラメータを用いてformから送信された値を受け取る formオブジェクトに定義したattr_accesorでストロングパラメータで許可したキーを受け取る saveメソッドなり保存処理を自前で実装。ActiveRecordのメソッドでDBに値を保存 コントローラーでredirectなどを用いてページをレンダリング 3で保存処理をした後はformオブジェクトの役目は終わる。 json形式のレスポンスをどう返すか? ところがSPAでフロントエンドから非同期でAPIを動かす場合はjson形式でレスポンスを返さないといけない。 そこで以下のようにハッシュ形式で保存した複数のモデルをsaveメソッドの戻り値とする。 def save hoge = Hoge.new(some_column: some_value) fuga = Fuga.new(some_column: some_value) # 別々にレスポンスとして扱うためにハッシュ形式を採用(配列でもいけるが、なんのデータなのかわかりやすくしたい) hash = {} hash[:hoge] = hoge hash[:fuga] = fuga return hash #生成したハッシュをコントローラーに返し、レスポンスにする end こうするとコントローラーでhashから値を取り出す形でjson形式のレスポンスを定義できる。 def create @test = Test.new(test_params) if @output.valid? test_save_result = @test.save # ステータスは手動で設定する。リソース保存時のステータスは201 render status: 201, json: { hoge: test_save_result[:hoge], fuga: test_save_result[:fuga] } else render status: 422, json: { errors: @test.errors.full_messages } end end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

undefined method `devise' for 〜のエラーに遭遇した

対処 参考:https://note.com/oreno/n/n1e32cefe430b 解決手段 先に解決方法ですが 一旦、railsを止めて再度、rails sで再起動すれば起動しました。 原因 原因は、railsを起動したまま $ rails g devise:install $ rails g devise user $ rails db:migrate の操作をしていたためだと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[個人開発]SNSを公開して起こった3つの事件

初めに 一週間前にrailsで作ったSNSを公開しました。そこで起こったことを書いていこうと思います。 作ったアプリ AmmotというSNSでコンセプトは「制限の少ない自由な投稿を」です。 文字数制限が6000字まで、画像・動画・PDF・音声は同時に10個まで投稿可能なブログに近いSNSです。今はマークダウンにも対応しています。 以前にもqiitaで宣伝させていただきました。 【個人開発】制限のない自由なSNS作ってみた! 事件1 XSS攻撃大量発生 ※一部です まぁ公開したてのwebアプリあるあるだと思いますが、Qiitaで宣伝して「いっぱい人来るかなー?」なんてワクワクしてたらXSSを狙う投稿が大量発生してちょっと萎えました(普通に使ってくれる人ももちろんいました)。 事件1の対策 = sanitize markdown(g.content) html_safeを消してsanitizeを追加するだけ。 こんな記事もあるがtagsやattributesを設定しなくてもsanitize だけで十分対策になる。 逆にtagsなどを書くとシンタックスハイライトができなくなったので注意です。 てかhtml_safeってなんでこんな使われてるんでしょうか?名前に反して結構危険なメソッドなのに...。 事件2 速度おっそ!! ログなどは取り忘れましたがログイン後のトップページを開くのに10秒くらいかかってました。 SNSに速度はかなり重要なのに...。 開発環境では結構いいPCを使っているのでパフォーマンスとか全く気にせず作っていました。 事件2の対策 countメソッドを徹底的に消す。 //悪い例 = g.comments.count = g.likes.count こういう文よく見ますよね。ただまじでこれはやめたほうがいいです。自分の場合、countメソッドからlengthメソッドに変えただけで速度が倍くらいになった。countメソッド怖ええ.. //良い例 = g.comments.pluck(:id).length = g.likes.pluck(:id).length 動作は全く変わりません。 キャッシュに対応する キャッシュに対応するだけでActiveRecordが3分の1くらいになります。 ただこれが3つ目の事件となります。 事件3 キャッシュ 自分はキャッシュに触れるのが初めてだったので???って状態でした。やっとキャッシュに対応したと思いリリースしたらバグの連続。 ・無限スクロールが動かない ・違うユーザーの投稿が自分の投稿一覧に現れる ・てかそもそも全然早くないしむしろ遅くなった気がする などなど この時に修正しようと何度も連続でアプデしたのでサーバーが重くなりどんどん動作が遅くなり...利用者が減ったのかなと考えています。 一回すべて取っ払いシンプルにコレクションキャッシュで実装したらうまくいきました。 def dashboard #フォローしてるユーザーと自分の投稿を取得 @posts = Post.where(user_id: [current_user.id, *current_user.following_ids]).where(public: true).order(created_at: :desc).page(params[:page]).without_count.per(20) end dashboard h1 dashboard = render "datas", posts: @posts _datas.html.slim .jscroll //投稿かいいねかリツイートされたらキャッシュキーが更新される = render partial: 'data', collection: posts, as: "g", cached: -> (g) { [g, g.likes.ids, g.reports.ids] } .none = link_to_prev_page posts, '前のページ', class: "prev" = link_to_next_page posts, '次のページ', class: "next" javascript: $('.jscroll').jscroll({ contentSelector: '.jscroll', nextSelector: 'a.next', loadingHtml: '読み込み中' }); _data.html.slim = g.content こんな感じでうまくいきました。 番外編 windows redisの入れ方 最初キャッシュで困ったのがwindowsでredisをダウンロードする記事が見当たらないこと。 なので自分が忘れないためにもここに書いておきます。 1: https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100 にアクセスして一番上の.msiをダウンロード。すこし更新日が古いですがこれが最新のようです。 2: 出来たらダウンロードしたものを起動してNEXT連打。最後のfinishまで変更する場所は特にありません。 3: 動作確認 redis-server ターミナルで実行 まとめ ・html_safeとcountには気を付けろ ・キャッシュはしっかり動作確認をしよう ・XSS攻撃はやめてくれ ・Qiitaのトップページをトレンドに戻してくれ ・Ammot使ってみてくれ ↓Ammot URL https://ammot.net/ ↓僕のAmmotのアカウント https://ammot.net/user/yamada(%E9%96%8B%E7%99%BA%E8%80%85) ↓僕のツイッターのアカウント https://twitter.com/yamada1531
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Bootstrap] table の 列 を非表示にする(レスポンシブ対応)

環境設定 Ruby 2.6.6 Rails 6.1.2.1 slim Bootstrap5 躓いたところ ・Bootstrap で table 作成時に境界線が直線にならない(画像内First Columnの下) [bp ≧ 768px(md)] [bp < 768px ] *.html.slim .container .row .col-12 table.table thead tr th scope="col" p # th.d-none.d-md-block scope="col" p First th scope="col" p Last th scope="col" p Handle tbody tr th scope="row" p 1 td.d-none.d-md-block p Mark td p a td p b tr th scope="row" p 2 td.d-none.d-md-block p Mark td p c td p d 解消方法 *.html.slim - td.d-none.d-md-block + td.d-none.d-md-table-cell 背景・原因など ・任意の画面幅の大きさの時に、テーブルセル(tr,td)を表示する場合は、 slim tr.d-[ブレイクポイント(md/lgなど)]-table-cell" ・"bootstrap table 列 非表示" でググるも期待した結果を得られず.. -> "bootstrap table column hide"で解決策を見つけた。 ・あとで"bootstrap table 列 非表示 レスポンシブ"で検索したら出てきた。言葉足らずでした... 参考URL
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsでruby組み込みライブラリを拡張する

任意のフォルダに拡張ファイルを配置 lib/core_ext/string.rb class String def hoge self+" fuga" end end 'config/initializers'配下に以下のようなファイルを配置 config/initializers/core_ext.rb Dir.glob(File.join(Rails.root, 'lib', '*_ext', '*.rb')) do |file| load file end これで Strinig.hoge が使えるようになった。 以下がとても参考になった https://dev.classmethod.jp/articles/ruby-object-to-boolean/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[ WIP ]【Rails & Flutter】管理者アプリ(Web) + ユーザーアプリ(Web) + ユーザーアプリ(スマホ) な開発

この記事は絶賛執筆中です。 実作業と同時並行で執筆しているため、書き方が雑だったり、文章量が多くなっていたり、途中省略していたりと読み辛くなっていると思います。 今のうちにストックしておいて頂ければリファクタした際に通知が届きますので、気長にお待ちいただければ幸いです。 また、ツッコミどころや質問等ありましたらお気軽にコメントくださいませ。 概要 管理者アプリ(Web) ユーザーアプリ(Web) ユーザーアプリ(スマホ) という複数のAPIクライアントが存在する場合、どのような構成にするべきかを考えた。 結論としては、API用サーバ再度アプリをRailsで実装し、各クライアントからのリクエストを処理することとした。 この記事では、RailsでAPIアプリを作る全貌を解説する。 まずは開発環境を整える。▶︎ 参考記事 開発環境の準備 ※ Homebrewはインストール済みの前提 Homebrewの診断 terminal $ brew doctor ▼ ▼ ▼ ▼ ▼ 実行結果 ▼ ▼ ▼ ▼ ▼ Please note that these warnings are just used to help the Homebrew maintainers with debugging if you file an issue. If everything you use Homebrew for is working fine: please don't worry or file an issue; just ignore this. Thanks! Warning: A newer Command Line Tools release is available. Update them from Software Update in System Preferences or run: softwareupdate --all --install --force If that doesn't show you any updates, run: sudo rm -rf /Library/Developer/CommandLineTools sudo xcode-select --install Alternatively, manually download them from: https://developer.apple.com/download/more/. どうやら新しいコマンドラインツールがリリースされたらしい。 警告文通りにソフトウェアアップデートを行う。 terminal $ softwareupdate --all --install --force ▼ ▼ ▼ ▼ ▼ 実行結果 ▼ ▼ ▼ ▼ ▼ Software Update Tool Finding available software No updates are available. 何らアップデートされなかったため、これまた警告文通りにコマンドラインツールを削除し、再度インストールする。 terminal $ sudo rm -rf /Library/Developer/CommandLineTools Password: ◀︎ パスワード入力を求められる 入力文字は表示されないので間違えないよう入力する $ sudo xcode-select --install$ sudo xcode-select --install ここでダイアログが出てくるので同意してインストールする 再度 brew doctor 実行。 terminal $ brew doctor ▼ ▼ ▼ ▼ ▼ 実行結果 ▼ ▼ ▼ ▼ ▼ Your system is ready to brew. うまくいった。 Homebrewの更新 続いてHomebrewを最新版にアップデートする。 terminal $ brew update ▼ ▼ ▼ ▼ ▼ 実行結果 ▼ ▼ ▼ ▼ ▼ brew update Updated 3 taps (homebrew/core, homebrew/cask and dart-lang/dart). ==> Updated Formulae curl ✔ exploitdb freetds svtplay-dl ==> Updated Casks alt-tab gather lingon-x moneymoney sejda-pdf You have 15 outdated formulae installed. You can upgrade them with brew upgrade or list them with brew outdated. 何やら15個も期限切れのフォーミュラ(オンラインパッケージブラウザ)があるらしい。 えい。 terminal $ brew upgrade ▼ ▼ ▼ ▼ ▼ 実行結果 ▼ ▼ ▼ ▼ ▼ Updating Homebrew... ==> Upgrading 15 outdated packages: heroku/brew/heroku 7.50.0 -> 7.52.0 certbot 1.13.0 -> 1.14.0 ruby-build 20210309 -> 20210405 sqlite 3.34.1 -> 3.35.4 dialog 1.3-20210306 -> 1.3-20210324 curl 7.75.0 -> 7.76.1 ............ 中略 ............. ==> ruby-build ruby-build installs a non-Homebrew OpenSSL for each Ruby version installed and these are never upgraded. To link Rubies to Homebrew's OpenSSL 1.1 (which is upgraded) add the following to your ~/.zshrc: export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)" Note: this may interfere with building old versions of Ruby (e.g <2.4) that use OpenSSL <1.1. たくさんのフォーミュラが更新されたっぽい。 これでHomebrewの準備は完了。 rbenv & ruby-buildの準備 ここはセットアップ済みだったため省略。 まだの方は 参考記事 参照。 bundlerの準備 bundler はインストール済みだったためupdateしてみる。 terminal $ gem update bundler ▼ ▼ ▼ ▼ ▼ 実行結果 ▼ ▼ ▼ ▼ ▼ Updating installed gems Updating bundler Fetching bundler-2.2.16.gem Successfully installed bundler-2.2.16 Parsing documentation for bundler-2.2.16 Installing ri documentation for bundler-2.2.16 Installing darkfish documentation for bundler-2.2.16 Done installing documentation for bundler after 7 seconds Parsing documentation for bundler-2.2.16 Done installing documentation for bundler after 2 seconds mysqlの準備 ここもすでにセットアップ済みだったため割愛。 まだの方は 参考記事 参照。 rubyのバージョンを設定する 前の手順でインストールしたrbenvを使ってrubyのバージョンを指定する。 せっかくなので現時点での最新安定板を使う。 terminal $ rbenv global 3.0.0 $ rbenv rehash $ ruby -v ▼ ▼ ▼ ▼ ▼ 実行結果 ▼ ▼ ▼ ▼ ▼ ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20] Rails の準備 次にRailsをインストールする。 ちなみに今までrailsコマンドが使えてたのに、rubyのバージョンを変更したら急にrailsコマンドが使えなくなった、なんて体験したことある人も多いのでは? そんな人はこんなメッセージが表示されるはず。 terminal $ rails -v rbenv: rails: command not found The `rails' command exists in these Ruby versions: 2.6.6 3.0.0 つまりrailsはrubyのバージョンごとの環境にインストールされているようだ。 上記の場合はruby2.6.6と3.0.0でなら使えるよ、と。 ここで躓いた人の参考になればこれ幸い。 余談はここまで。 さっさとrailsをインストールする。 terminal $ gem install rails Fetching concurrent-ruby-1.1.8.gem Fetching sprockets-4.0.2.gem Fetching tzinfo-2.0.4.gem Fetching i18n-1.8.10.gem Fetching rack-2.2.3.gem Fetching zeitwerk-2.4.2.gem Fetching nokogiri-1.11.3-x86_64-darwin.gem ............ 中略 ............. 37 gems installed ちなみに gem install [GemName] はグローバル環境にインストールする際に使用するコマンド。 それが嫌な人は 参考記事 のようにディレクトリを作り、そのディレクトリ内で bundle init してからrailsをインストールする手順を参考にしてほしい。 いざ開発 RailsアプリをAPIモードで作成する ようやく下準備が終わったのでrailsアプリを作る。 DBはMySQLを採用したいので -d オプション も忘れずに。 terminal $ rails new アプリ名 -d mysql --api (作ったアプリのディレクトリに移動する) $ cd アプリ名 兎にも角にもGit管理 開発を進めていく上でソースコードをGit管理することは必須だ。 今後チームで開発するかもしれない 履歴を確認したい場面が出てくるはず 作業の巻き戻しも楽々 などの理由にGit管理をオススメする。 (今どきGit使ってないプロジェクトなんて抹殺されるべき) ここで1つやっておきたいことがある。 それは vendor/bundle ディレクトリをGit管理から除外すること。 .gitignore の最終行に下記一文を追加する。 .gitignore /vendor/bundle 記念すべき最初のコミットをする。 terminal $ git add -A $ git status $ git commit -m "Init: アプリ作成" 何かしらコマンドを実行したことによる変更なのであれば、コミットメッセージを実行コマンドにしてもいい。 今回であればこんな感じ。 terminal $ git commit -m "Init: rails new アプリ名 -d mysql --api" これだと見返した時に何をしたかがひと目でわかる。 ブランチ名を変更する いつからか、master というブランチ名を main に変更しちゃおうぜという流れが起こった。 [ 参考記事 ] GitHub、これから作成するリポジトリのデフォルトブランチ名が「main」に。「master」から「main」へ変更 こちらもその流れに乗っかる。 terminal $ git branch -m master main これで開発準備完了。 DBを作成する 早速DBを作成する。 ※ Railsをグローバル環境ではなくプロジェクトにインストールしている場合は、先頭に bundle exec と付ける。 terminal $ rails db:create ▼ ▼ ▼ ▼ ▼ 実行結果 ▼ ▼ ▼ ▼ ▼ Created database 'アプリ名_development' Created database 'アプリ名_test' 次はサーバを起動してみる。 terminal $ rails s この画面が表示されればOK。 Gemの選定 ※ 随時追加予定 active_model_serializers committee committee-rails rubocop rspec-rails ridgepole
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む