20211025のRailsに関する記事は17件です。

Railsの環境構築やデプロイを学ぶ上で役に立った記事

普段はインフラ寄りの仕事をしているエンジニアですが、Railsの環境構築やデプロイについてキャッチアップする機会があり、色々学ぶうちにブックマークが溜まってきました。 同様の内容を学習中の方の参考になればと思い、Qiita記事化します。 環境構築関連 Docker Rails 6.1のDocker開発環境構築をEvil Martians流にやってみた(更新)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社 クジラに乗ったRuby: Evil Martians流Docker+Ruby/Rails開発環境構築(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社 Nginx+Rails6.0+MySQL8.0+Adminer:docker-compose で rails new Ruby on Railsの開発環境をDockerで構築する方法(Rails 6.x) nginx + Rails (unicorn) + MySQL 環境を Docker で構築する - Qiita Docker イメージサイズを抑えながら Ruby on Rails + PostgreSQL の開発環境を作成する - bitA Tech Blog docker-compose+Nginx+Rails6 で静的コンテンツをNginxから配信する https://github.com/ledermann/docker-rails nginxとPumaを連携し、nginx + Puma + Rails6の開発環境を構築する手順 | Enjoy IT Life 【決定版】rbenv を使った ruby のインストール AWS EC2等 Ruby on Rails 6をAmazon Linux 2で動かす - サーバーワークスエンジニアブログ Amazon Linuxでrbenvをインストール - Qiita CentOS8上にnginxとpumaとRailsを手作業で構築した後に手動でデプロイする - もちゅろぐ 【Rails】Nginx, Puma な環境によるデプロイ&サーバーの勉強【AWS EC2】 - Qiita AWS Rails 6 + MySQL + Nginx な環境の作成方法 サーバー編 - たけログ EC2にRails環境構築(Ruby 2.6、Rails 6.0) - 欲望のおもむくままに RailsアプリをAWSにイチからデプロイするまでの手順メモ · Code of Duty CI関連 https://github.com/CircleCI-Public/circleci-demo-ruby-rails 自動デプロイ(CD)関連 ECS Amazon ECSで動かすRailsアプリのDockerfileとGitHub Actionsのビルド設定 - メドピア開発者ブログ Capistrano Capistrano公式ドキュメント CircleCI + Capistrano + AWS(EC2) + Railsで自動デプロイしてみた - Qiita はじめてのCapistrano - Qiita Capistranoでデプロイ自動化 - kumilog.net CapistranoでRailsデプロイ - kumilog.net https://github.com/capistrano/rails https://github.com/capistrano/rbenv multistage 環境で capistrano-rbenv を使うときは rbenv_path の扱いに注意! - Hack like a rolling stone capistrano3でpumaの運用ー設定ファイルの管理どうする? - Qiita Rails5+Puma+Nginxな環境をCapistrano3でEC2にデプロイする(後編) - Qiita ざくにく定食: capistranoでbundle installするまで AWS CodeStar CodeStarではじめるRailsアプリのCodeDeploy化 puma Pumaの使い方 まとめ - 猫Rails Puma の Daemonization が廃止された理由と、デーモン化したいときはどうするべきか - 完全に理解した.com Pumaの起動におけるpumaコマンドとpumactlコマンドの違い - Qiita ポートを指定してPumaを起動するとsocketファイルをlistenしなくなる - Qiita nginx commented nginx.conf for Ruby on Rails bundle config bundle config | Bundler日本語ドキュメント | Ruby STUDIO ログローテート 【Ruby on Rails】ログ出力とログローテートの設定まとめ【Logger】 - きゃまなかのブログ 【Rails】Railsアプリのログローテーション設定を行う - AUTOVICE devise Devise入門 64のレシピ - 猫Rails その他 不正な config/master.key が原因でRailsの起動に失敗するケースとその対処方法 - Qiita
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsアプリの雛形作成!

①.railsコマンド Webアプリケーションを作成するために、これからターミナルに様々なコマンドを打っていくことになります! Railsに関する動作を行うには、ターミナルにてrailsコマンドを使用します! Railsに関する命令は、すべてrailsというコマンドから始まります! rails コマンド名とすることで、さまざまな動作を実行できます! 下記は例となります! # railsに続けて、コマンドを記述する % rails コマンド名 新しいアプリケーションを作成するには、ターミナルでrails newというコマンドを実行します! ②.rails newコマンド Railsで新規アプリケーションを作成する際に使用します! このコマンドを実行することで、Railsアプリケーションの雛形が作成されます! コマンドを実行する際には作成したいアプリケーション名を最後につけてrails new アプリケーション名とコマンドを実行します! 下記は新規Railsアプリケーションの作成の例です! # Railsアプリケーションを作成 % rails new アプリケーション名 rails newコマンドで雛形を作成するときには、以下の2つの指定を行います! ・使用するRailsのバージョンの指定 ・オプションの指定 ①使用するRailsのバージョンの指定! newの前に、使用したいRailsのバージョンを指定することができます! # Railsのバージョンを指定してアプリケーションを作成(6.0.0の場合) % rails _6.0.0_ new アプリケーション名 今回は例では、バージョン6.0.0を使用します! バージョンが変わるとプログラムの書き方が変わることがあるため、必ず6.0.0でアプリケーションを作成してください! *バージョンを指定しない場合は、PCにインストールされている最新のRailsのバージョンが使われます! ②オプションの指定 ハイフン-を使い-オプション名と追記することでオプションをつけることができます! # オプションを付けてアプリケーションを作成 % rails _6.0.0_ new アプリケーション名 -オプション名 オプションとは、コマンド実行時に後ろに続けて入力することで、コマンドの動作を変更したり追加することができるものです! 各コマンドごとにさまざまなオプションが用意されています! ③. -dオプション -dオプションは、rails newコマンドにつけることができるオプションです! -dオプションをつけると、作成するアプリが利用するデータベースの管理システムの種類を指定できます! 例 % rails new アプリケーション名 -d データベース管理システム名 今回の例では、「mysql」というデータベース管理システムを利用します! # データベース管理システムにmysqlを指定 % rails new アプリケーション名 -d mysql 例えば、test_appと言うアプリを作成する際は、以下のようになります! # Railsのバージョン6.0.0を用いて、TestAppを作成 % rails _6.0.0_ new test_app -d mysql これでアプリの雛形は作成できます! ④.データベースを作成 Railsアプリケーションの雛形が作成できました! Webアプリケーションは、様々なデータを保存したり表示したりします! しかし、いま作った雛形には、まだデータベースがないのでデータが蓄積できません! データの保存に必要なデータベースも作成します! ⑤.rails db:createコマンド 新しくデータベースを作成するにはrails db:createというコマンドを実行します! # データベースを作成する % rails db:create *作成とは反対に、データベースを削除する場合はrails db:dropコマンドを使用します! Railsでは、データを元に動作や表示を変更します! rails db:createコマンドを使ってデータベースを作成しましょう! rails db:createコマンドを実行すると、以下の2つのメッセージがターミナルに表示されます! (例)ターミナル Created database 'test_app_development' Created database 'test_app_test' つまり、2つのデータベースが作成されたということです! これらは、自分のPCで開発を進めるために必要なデータベースとなります! ⑧.まとめ 簡単に言うと以下のようなります! railsコマンドとは、Railsに命令するためのコマンドのこと! rails newコマンドとは、Railsの新規アプリケーションを作成する際に使用するコマンドのこと! rails db:createコマンドとは、新しくデータベースを作成するコマンドのこと! こんな感じにまとまります! 基礎というか初めの段階なので、きっちり覚えておこうと思います! 何か説明で間違っていたらご指導お願い致します(_ _)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsチュートリアル第10章 TDDで編集を成功させる

TDDで編集を成功させる 今度は編集フォームが動作するようにしましょう。 flashメッセージが空でないかどうかと、 プロフィールページにリダイレクトされるかどうかをチェックします。 ユーザー名やメールアドレスを編集するときに毎回パスワードを入力するのは不便なので、(パスワードを変更する必要が無いときは)パスワードを入力せずに更新できると便利です。 編集の成功に対するテスト test/integration/users_edit_test.rb require 'test_helper' # test_helper.rbのパラメータ群を指定 class UsersEditTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) end . . . test "successful edit" do get edit_user_path(@user) assert_template 'users/edit' name = "Foo Bar" email = "foo@bar.com" patch user_path(@user), params: { user: { name: name, email: email, password: "", password_confirmation: "" } } assert_not flash.empty? # flashメッセージが空でないかどうか assert_redirected_to @user # プロフィールページにリダイレクトされるかどうか @user.reload # データベースから最新のユーザー情報を読み込み直して、 # 正しく更新されたかどうかを確認 assert_equal name, @user.name assert_equal email, @user.email # データベース内のユーザー情報が正しく変更されたか # どうかも検証します # 更新するときはパスワードを要求しない end end ユーザーのupdateアクション app/controllers/users_controller.rb class UsersController < ApplicationController . . . def create @user = User.new(user_params) # 外部メソッドを使う if @user.save # 保存の成功をここで扱う。 log_in @user # 登録後に自動ログインするため flash[:success] = "Welcome to the Sample App!" # 成功時一度だけ表示されるメッセージ redirect_to @user # urlを指定して表示する # 保存成功したらurlを表示する else render 'new' # 保存に成功しなければnewアクションに移動する # 失敗したらまた戻る end end def edit @user = User.find(params[:id]) # データベースから探す end def update @user = User.find(params[:id]) if @user.update(user_params) # 更新に成功した場合を扱う。 flash[:success] = "Profile updated" # 成功時にメッセージを表示 redirect_to @user # ユーザーページを表示させる else render 'edit' end end . . . end テスト ubuntu:~/environment/sample_app (updating-users) $ rails t Running via Spring preloader in process 16575 Started with run options --seed 34349 31/31: [============================] 100% Time: 00:00:01, Time: 00:00:01 Finished in 1.66895s 31 tests, 77 assertions, 0 failures, 0 errors, 0 skips 演習 1. 実際に編集が成功するかどうか、有効な情報を送信して確かめてみましょう。 確認 2. もしGravatarと紐付いていない適当なメールアドレス(foobar@example.comなど)に変更した場合、プロフィール画像はどのように表示されるでしょうか? 実際に編集フォームからメールアドレスを変更して、確認してみましょう。 gravatarをしていない。 多分 違うアイコンを表示されると思う。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsチュートリアル第10章 編集の失敗 編集失敗時のテスト

編集の失敗 編集に失敗した場合について扱っていきます。 updateアクションの作成をする ユーザーのupdateアクションの初期実装 app/controllers/users_controller.rb class UsersController < ApplicationController def show @user = User.find(params[:id]) # データベースからユーザー情報を取り出す end def new @user = User.new #新しくユーザーオプジェクトを作成する # オブジェクトの属性をつける end def create @user = User.new(user_params) # 外部メソッドを使う if @user.save # 保存の成功をここで扱う。 log_in @user # 登録後に自動ログインするため flash[:success] = "Welcome to the Sample App!" # 成功時一度だけ表示されるメッセージ redirect_to @user # urlを指定して表示する # 保存成功したらurlを表示する else render 'new' # 保存に成功しなければnewアクションに移動する # 失敗したらまた戻る end end def edit @user = User.find(params[:id]) # データベースから探す end def update @user = User.find(params[:id]) if @user.update(user_params) # 更新に成功した場合を扱う。 else render 'edit' end end private #外部から使えないようにする def user_params # Usersコントローラの内部でのみ実行される # Web経由で外部ユーザーにさらされない params.require(:user).permit(:name, :email, :password, :password_confirmation) # paramsとは、フォームなどによって送られてきた情報(パラメータ) # を取得するメソッドのこと # requireメソッドで受け取るパラメータ群を、 # permitメソッドで利用可能なパラメータ名を指定します。 # require,permitはセキュリティーの問題らしい。 # requireで:hogeを要求している # permitで許可されていない # ストロングパラメータは受け取る値に制限をかけている # 2つでストロングパラメータらしい end end 演習 1. 編集フォームから有効でないユーザー名やメールアドレス、パスワードを使って送信した場合、編集に失敗することを確認してみましょう。 確認 編集失敗時のテスト エラーを検知するための統合テストを書いていきましょう。 統合テストを生成 ubuntu:~/environment/sample_app (updating-users) $ rails generate integration_test users_edit Running via Spring preloader in process 6559 invoke test_unit create test/integration/users_edit_test.rb 編集の失敗に対するテスト test/integration/users_edit_test.rb require 'test_helper' # test_helper.rbのパラメータ群を指定 class UsersEditTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) end test "unsuccessful edit" do get edit_user_path(@user) # 編集ページを取得 assert_template 'users/edit' # 編集ページが表示されているか?d patch user_path(@user), params: { user: { name: "", email: "foo@invalid", password: "foo", password_confirmation: "bar" } } # 上書きする # オプション引数かな? # HTTP の PATCH リクエストメソッドは、リソースへの部分的な変更を適用 # 編集に用いられやすい # テストだからrequre,permitを使わなくていいのかな? assert_template 'users/edit' end end テスト ubuntu:~/environment/sample_app (updating-users) $ rails tRunning via Spring preloader in process 8279 Started with run options --seed 50136 30/30: [============================] 100% Time: 00:00:02, Time: 00:00:02 Finished in 2.60030s 30 tests, 70 assertions, 0 failures, 0 errors, 0 skips 演習 1.リスト 10.9のテストに1行追加し、正しい数のエラーメッセージが表示されているかテストしてみましょう。ヒント: 表 5.2で紹介したassert_selectを使ってalertクラスのdivタグを探しだし、「The form contains 4 errors.」というテキストを精査してみましょう。 require 'test_helper' # test_helper.rbのパラメータ群を指定 class UsersEditTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) end test "unsuccessful edit" do get edit_user_path(@user) # 編集ページを取得 assert_template 'users/edit' # 編集ページが表示されているか?d patch user_path(@user), params: { user: { name: "", email: "foo@invalid", password: "foo", password_confirmation: "bar" } } # 上書きする # オプション引数かな? # HTTP の PATCH リクエストメソッドは、リソースへの部分的な変更を適用 # 編集に用いられやすい # テストだからrequre,permitを使わなくていいのかな? assert_template 'users/edit' assert_select "div", "alert" end end ubuntu:~/environment/sample_app (updating-users) $ rails t Running via Spring preloader in process 8968 Started with run options --seed 41135 FAIL["test_unsuccessful_edit", #<Minitest::Reporters::Suite:0x0000557d393d0e80 @name="UsersEditTest">, 3.456445838000036] test_unsuccessful_edit#UsersEditTest (3.46s) <alert> expected but was <sample app Home Help Log in>.. Expected 0 to be >= 1. test/integration/users_edit_test.rb:26:in `block in <class:UsersEditTest>' 30/30: [============================] 100% Time: 00:00:03, Time: 00:00:03 Finished in 3.53432s 30 tests, 71 assertions, 1 failures, 0 errors, 0 skips わからない。 答え require 'test_helper' # test_helper.rbのパラメータ群を指定 class UsersEditTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) end test "unsuccessful edit" do get edit_user_path(@user) # 編集ページを取得 assert_template 'users/edit' # 編集ページが表示されているか?d patch user_path(@user), params: { user: { name: "", email: "foo@invalid", password: "foo", password_confirmation: "bar" } } # 上書きする # オプション引数かな? # HTTP の PATCH リクエストメソッドは、リソースへの部分的な変更を適用 # 編集に用いられやすい # テストだからrequre,permitを使わなくていいのかな? assert_template 'users/edit' assert_select "div.alert", "The form contains 4 errors." # alertクラスのdivを探すことによってエラーのタグを探すことができる。 end end これでエラーは起こらなかった。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsチュートリアル第10章 データを更新する

ユーザーの更新・表示・削除 edit、update、index、destroyアクション RESTアクションを完成 認可モデル(Authorization Model)について説明 すべてのユーザーを一覧できるようにします サンプルデータとページネーション(pagination)を導入する ユーザーを削除し、データベースから完全に消去する機能を追加します。 管理ユーザーという特権クラスを作成し、このユーザーにのみ削除を許可するようにします ユーザーを更新する edit、updateアクションを作成する。 $ git checkout -b updating-users 編集フォーム ユーザーのeditアクション app/controllers/users_controller.rb class UsersController < ApplicationController . . . def edit @user = User.find(params[:id]) # データベースから探す end private #外部から使えないようにする def user_params # Usersコントローラの内部でのみ実行される # Web経由で外部ユーザーにさらされない params.require(:user).permit(:name, :email, :password, :password_confirmation) end end ユーザーのeditビュー app/views/users/edit.html.erb <% provide(:title, "Edit user") %> <h1>Update your profile</h1> <div class="row"> <div class="col-md-6 col-md-offset-3"> <%= form_with(model: @user, local: true) do |f| %> <%= render 'shared/error_messages' %> <%= f.label :name %> <%= f.text_field :name, class: 'form-control' %> <%= f.label :email %> <%= f.email_field :email, class: 'form-control' %> <%= f.label :password %> <%= f.password_field :password, class: 'form-control' %> <%= f.label :password_confirmation, "Confirmation" %> <%= f.password_field :password_confirmation, class: 'form-control' %> <%= f.submit "Save changes", class: "btn btn-primary" %> <% end %> <div class="gravatar_edit"> <%= gravatar_for @user %> <a href="https://gravatar.com/emails" target="_blank">change</a> </div> </div> </div> レイアウトの “Settings” リンクを更新する app/views/layouts/_header.html.erb <header class="navbar navbar-fixed-top navbar-inverse"> <div class="container"> <%= link_to "sample app", root_path, id: "logo" %> <nav> <ul class="nav navbar-nav navbar-right"> <li><%= link_to "Home", root_path %></li> <li><%= link_to "Help", help_path %></li> <% if logged_in? %> <li><%= link_to "Users", '#' %></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Account <b class="caret"></b> </a> <ul class="dropdown-menu"> <li><%= link_to "Profile", current_user %></li> <li><%= link_to "Settings", edit_user_path(current_user) %></li> <li class="divider"></li> <li> <%= link_to "Log out", logout_path, method: :delete %> </li> </ul> </li> <% else %> <li><%= link_to "Log in", login_path %></li> <% end %> </ul> </nav> </div> </header> 演習 1. 先ほど触れたように、target="_blank"で新しいページを開くときには、セキュリティ上の小さな問題があります。それは、リンク先のサイトがHTMLドキュメントのwindowオブジェクトを扱えてしまう、という点です。具体的には、フィッシング(Phising)サイトのような、悪意のあるコンテンツを導入させられてしまう可能性があります。Gravatarのような著名なサイトではこのような事態は起こらないと思いますが、念のため、このセキュリティ上のリスクも排除しておきましょう。対処方法は、リンク用のaタグのrel(relationship)属性に、"noopener"と設定するだけです。早速、リスト 10.2で使ったGravatarの編集ページへのリンクにこの設定をしてみましょう。 <div class="gravatar_edit"> <%= gravatar_for @user %> <noopener href="https://gravatar.com/emails" target="_blank">change</noopener> </div> 2. リスト 10.5のパーシャルを使って、new.html.erbビュー(リスト 10.6)とedit.html.erbビュー(リスト 10.7)をリファクタリングしてみましょう(コードの重複を取り除いてみましょう)。ヒント: 3.4.3で使ったprovideメソッドを使うと、重複を取り除けます3 。 貼り付けるだけ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

クリッカブルマップの複数の遷移先画面を一つのアクションによって表示する方法

はじめに jQueryプラグインであるJapanMapというものを自作アプリに導入したが、北海道地方から沖縄地方までの9つの遷移先画面をどのようにルーティングやアクションで表現するかが問題となった。Railsは5.2.6を使用。 なお、本記事は【ルーティング設計】1つのアクションで複数のビューを切り替えて表示する方法を参考にさせて頂いています。 試したこと とりあえず、以下のようにルーティングを書いてみた。 config/routes.rb Rails.application.routes.draw do get "/region/hokkaido" => "homes#hokkaido" get "/region/tohoku" => "homes#tohoku" get "/region/kanto" => "homes#kanto" get "/region/chubu" => "homes#chubu" get "/region/kinki" => "homes#kinki" get "/region/chugoku" => "homes#chugoku" get "/region/shikoku" => "homes#shikoku" get "/region/kyusyu" => "homes#kyusyu" get "/region/okinawa" => "homes#okinawa" end 明らかに非効率である。そこで色々調べた結果、冒頭に挙げた記事を発見。早速適用してみる。 解決方法 ルーティングファイルを以下のように変更し、params[:region]に地方名を入れて、homesコントローラのregionアクションに処理させることにした。 config/routes.rb Rails.application.routes.draw do get "/region/:region" => "homes#region", as: "region" end controllers/homes_controller.rb class HomesController < ApplicationController def region render "region/#{params[:region]}" end end こうすることで大幅に記述量を減らせた。各都道府県のビューについても同じようにやればよかったのだろうが、複雑に考えて迷走することになる。。それはまた別の記事で。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS cloud9で、rails serverが起動しない時にやったこと。

昨日中断するまでは起動していたはずの$ rails serverを再開しようとしたら qiita.rb Could not find gem 'puma (= 3.9.1)' in any of the gem sources listed in your Gemfile. Run `bundle install` to install missing gems. 出たよと思いつつ、とりあえず$ bundle installをしてみる。 quitta.rb $ buindle install Command 'buindle' not found, did you mean: command 'bundle' from snap ruby (3.0.2) command 'bundle' from deb ruby-bundler See 'snap info <snapname>' for additional versions. 豪快にスペルを間違えるも、本人はなんかエラー出てるなと流し見して気づかず、$ bundle installではない。と決めつけて、ググる。 エラーは本当によく読もう(笑)   なので、最初にスペルミスをしなかった場合の結果が分からないのが悔しい。 また次のエラーで会いましょう。 それはさておき、私が解決した方法は、こちらの記事を参考にしました。 実際にこのコマンドを上から入力して解決しましたが、なぜ解決したのかはわかりません。 もっと勉強していけばわかるようになると思っていますが、足踏みしていられないので試しました。 quitta.rb #remove user-specific gems and git repos $ rm -rf ~/.bundle/ ~/.gem/ # remove system-wide git repos and git checkouts $ rm -rf $GEM_HOME/bundler/ $GEM_HOME/cache/bundler/ # remove project-specific settings and git repos $ rm -rf .bundle/ # remove project-specific cached .gem files $ rm -rf vendor/cache/ # remove the saved resolve of the Gemfile $ rm -rf Gemfile.lock # try to install one more time $ bundle install
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】present?はblank?の真逆のメソッド

present? !blank? を実行するメソッド nil, "", " "(半角スペースのみ), [](空の配列), {}(空のハッシュ) のときにfalseを返す blank? nil? + empty? のようなメソッド nil, false, "", " "(半角スペースのみ), [](空の配列), {}(空のハッシュ) のときにtrueを返す 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【RSpec】let!で定義した値がnilを返す現象

テストを書いていてlet!で定義した値がなぜかnilで返ってくる現象に時間をとられたので もう引っかからないようにまとめる。 テスト失敗 pryでデバッグしたところcat_countがnil spec.rb describe 'cat_countテスト' do let!(:cat_count) { 2 } it '1が足されること' do #binding.pry cat_count += 1 expect(cat_count).to eq 3 end end NoMethodError: undefined method `+' for nil:NilClass 原因 (近日更新予定) テスト成功 spec.rb describe 'cat_countテスト' do it '1が足されること' do cat_count = 2 cat_count += 1 expect(cat_count).to eq 3 end end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

incompatible library version - msgpack.bundle (LoadError) 解決法

はじめに require': incompatible library version - /Users/[name]/rails/rails-tutorial/sample_app/vendor/bundle/ruby/3.0.0/gems/msgpack-1.4.2/lib/msgpack/msgpack.bundle (LoadError) railsチュートリアルをローカル環境で進めているときにこのエラーに出くわしました。 static-pagesコントローラを生成してから何故かrailsコマンドが使えなくなり、身動きが取れなくなりました。 私の環境にピッタリの記事が中々見つからなかったので書くことにしました。 筆者の環境 Macbook Air(M1, 2020) macOS Big Aur バージョン11.4 ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [arm64-darwin20] Rails 6.1.4.1 Bundler version 2.2.29 解決策 rubyのバージョンを2.7.3にしたら動きました。 参考にした記事はこちら https://stackoom.com/question/4YA1j 試したこと ・railsのバージョンを下げてみる ・rubyのバージョンを3.0.2 -> 3.0.1にしてみる ・gemを一回消してからまたインストールする .msgpackをインストールする ・springを再起動させる ・bundlerのバージョンを下げてみる などなど 調べて出てきたことを割と片っ端からしました。 感じたこと 検索をかけて調べているうちに、こちらのエラー文はM1mac(arm64)の環境に多いもののように感じました。 Rosettaを使用していればでない、Rosettaに変えたら解決されるエラーのようです。 私と同じような環境の方は試してみてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Mac】ホットリロードできない時の対処法

環境 ・macOS Big Sur バーション11.5.2 ・シェル zsh ・Ruby 3.0.2 ・rails 6.1.4 ・My SQL 8.0.23 ・Docker 20.10.8 ・react  17.0.2 ・typescript  4.4.4 希望 Docker+rails+react+typescriptで環境構築し、ホットリロードまでしようとしていました. したこと ①webpacker.ymlのwatch_options:の下に aggregateTimeout: 300 poll: 500 を追加しました。 こんな感じです。 webpacker.yml watch_options: ignored: '**/node_modules/**' aggregateTimeout: 300 poll: 500 これでできるはずだができず、、、 次に ②.envファイルを作り .env CHOKIDAR_USEPOLLING=true を追記。 これも複数の記事を参考にし実行しましたがホットリロード(リロードなしで即テキストエディタの内容が反映される)はできず。 よってリロード画面を開発者モードで見ることに。 そこでこんなエラーを発見。 エラー Access to XMLHttpRequest at 'http://localhost:3035/sockjs-node/info?t=1635142686037' from origin 'http://0.0.0.0:3000' has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address space local. 調べるとCORS policyというものでURLがブロックされているとのこと。 解決策 chrome://flags/#block-insecure-private-network-requests 以上のサイトにアクセスし、 Block insecure private network requests をDisabledにする。 ↓ 無事ホットリロードできました!めでたしめでたし。 参考にしたサイト Docker + Rails6 + React + TypeScript の環境構築
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails はじめました [1. 環境構築]

要件 ruby 2.7.4 Rails 6.1.4 redis latest PostgreSQL 12.2 nginx 1.20 開発環境 macOS Big Sur VSCode Docker Desktop VSCode プラグイン Ruby Rails Ruby on Rails Rails DB Schema Docker 環境 以下リポジトリに完成した docker-compose.yml 等を格納 soso555BoBs/env-rails コンテナの構成 app rails 6.1.4 が稼働する ポート番号 3000 で listen web nginx 1.20 が稼働する ポート番号 80 で listen 受け取ったリクエストを app コンテナに渡す pgsql PostgreSQL 12.2 が稼働する ポート番号 5432 で listen rredis redis が稼働する ポート番号 6379 で listen rmail mailhog が稼働する ポート番号 1025 でメールを listen ポート番号 8025 で HTTP リクエストを listen 使い方 前提として、make コマンドを実行できるようにしておくこと 不可能な場合は、Makefile 内の各コマンドをコピペして実行すれば OK 初回 (Rails プロジェクトを作成する) $ git clone git@github.com:soso555BoBs/env-rails.git $ cd env-rails $ make create-project # Install Rails project 上記実行後 http://localhost:3000/ で動作確認 以下の手順を全て行うので時間がかかります rails インストール build docker image docker container up bundle install webpacker install rake db:create container restart 初回 (既存プロジェクトをインポートする) $ git clone git@github.com:soso555BoBs/env-rails.git $ cd env-rails $ git clone git@github.com:hogehoge/rails.git ./backend # Clone any project to the backend directory $ make init $ make up 2 回目以降 $ make up コンテナ終了 $ make down 詰まった点 bundle install した gem がコンテナを立ち上げる度に無くなる gem がインストールされたディレクトリを永続化していないため 永続化するために docker-compose.yml に以下記述を追加 volumes: bundle-store: : : services: app: volumes: - type: volume source: bundle-store target: /usr/local/bundle nocopy: true nocopy: true のせいで、永続化しても更新されないため nocopy: true を削除 docker-compose run と build と up のタイミングに依り volume の内容に不整合が発生。以下記事により解決しました。 rails server 実行時に Webpacker configuration file not found エラーが発生する bundle install の後に webpacker install を実行することで対応 所感 実は「コンテナの構成」には嘘が書かれている。実装できていないので追々実装する。 volume の永続化の解決にものすごく苦労した。 きちんとオプションや記述形式を把握しない限りはコピペなんてするもんじゃない。 おかげで volume 周りの挙動について勉強になった ひとまずこの環境を用いて転職活動アプリを作っていこうと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsで関連モデルのレコード数を使って検索を行いたい時のメモ

TL;DR # 基本スタイル User.joins(:orders).group('users.id').having('COUNT(orders.id) > ?', 2) => User Load (0.9ms) SELECT "users".* FROM "users" GROUP BY users.id HAVING (COUNT(orders.id) > 2) # COUNT DISTINCT(いらないかも...) User.joins(:orders).group('users.id').having('COUNT(DISTINCT orders.id) > ?', 2) => User Load (1.8ms) SELECT "users".* FROM "users" INNER JOIN "orders" ON "orders"."user_id" = "users"."id" GROUP BY users.id HAVING (COUNT(DISTINCT orders.id) > 2) # 数値カラムと比較(購入数と年齢を比較する謎仕様(笑)) User.joins(:orders).group('users.id').having('COUNT(orders.id) > users.age') => User Load (3.9ms) SELECT "users".* FROM "users" INNER JOIN "orders" ON "orders"."user_id" = "users"."id" GROUP BY users.id HAVING (COUNT(orders.id) > users.age) # 別の関連モデルのレコード数と比較(購入数とレビュー数を比較) User.joins(:orders, :reviews).group('users.id').having('COUNT(orders.id) > COUNT(reviews.id)') => User Load (13.5ms) SELECT "users".* FROM "users" INNER JOIN "orders" ON "orders"."user_id" = "users"."id" INNER JOIN "reviews" ON "reviews"."user_id" = "users"."id" GROUP BY users.id HAVING (COUNT(orders.id) > COUNT(reviews.id)) 注意 GROUP BY ... HAVING ... の構文は or 系の構文とたまに干渉し、エラーが生じるので、Ransackなどで複雑な条件で検索したい時は要注意です。 余談 上記構文は自動的に関連レコードのないものを検索対象外にしたが、関連レコードがないことを検索したい場合は下記の構文でできます。 # おすすめ User.left_outer_joins(:orders).where(orders: {id: nil}) => User Load (1.1ms) SELECT "users".* FROM "users" LEFT OUTER JOIN "orders" ON "orders"."user_id" = "users"."id" WHERE "orders"."id" IS NULL # 一応こちらもできるが、無駄なSQLが発行される User.includes(:orders).where(orders: {id: nil}) => SQL (1.3ms) SELECT "users"."id" AS t0_r0, "users"."created_at" AS t0_r1, "users"."updated_at" AS t0_r2 ... 参考 Rails GroupでまとめてCountした結果をHavingを使って絞り込む Want to find records with no associated records in Rails
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby on Rails】初学者専用 デバック練習

Ruby on Railsの勉強を始めて3か月ほどがたちました。 自分でアプリケーションをつくっていくなかでたくさんエラーに悩まされました。 そのため、railsを始める人に知ってほしいエラー処理を作りました。 是非使ってみてください!! コードはこちら↓ https://github.com/koya1616/debug1.git それでは手順を説明していきます。 リポジトリをクローンしてみよう クローンについての記事はこちらもみるといいかもしれないです! ・Git clone から pushまで それではクローンしていきましょう terminal $ git clone https://github.com/koya1616/debug1.git $ cd debug1 簡単ですね。 dockerをつかってみよう dockerは環境構築に使います。ぜひ使ってみてください。 ・dockerの使い方などなど コマンドを打っていきます teminal $ docker-compose build $ docker-compose up -d 環境構築はもう完了してしまいました! GitHubの使い方とdockerを使っている方は楽勝ですね笑 デバックをしてみよう まずはブラウザにアクセスしましょう! http://localhost:3000/ さっそくエラー画面が表示されます!! エラー文を解析してデバックしてください!! もしわからなければこちらのファイルをさんこうにしてください! https://github.com/koya1616/debug1/blob/main/tips 答えは debug1/answers にかいてあります。 https://github.com/koya1616/debug1/blob/main/answers どうでしたか?? ここでは基本的なエラーを発生させました。 大事なことは調べる力や考える力だとおもいます。 Ruby on Rails のデバック練習でした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby on Rails】初学者専用 デバッグ練習

Ruby on Railsの勉強を始めて3か月ほどがたちました。 自分でアプリケーションをつくっていくなかでたくさんエラーに悩まされました。 そのため、railsを始める人に知ってほしいエラー処理を作りました。 是非使ってみてください!! コードはこちら↓ https://github.com/koya1616/debug1.git それでは手順を説明していきます。 リポジトリをクローンしてみよう クローンについての記事はこちらもみるといいかもしれないです! ・Git clone から pushまで それではクローンしていきましょう terminal $ git clone https://github.com/koya1616/debug1.git $ cd debug1 簡単ですね。 dockerをつかってみよう dockerは環境構築に使います。ぜひ使ってみてください。 ・dockerの使い方などなど コマンドを打っていきます teminal $ docker-compose build $ docker-compose up -d 環境構築はもう完了してしまいました! GitHubの使い方とdockerを使っている方は楽勝ですね笑 デバッグをしてみよう まずはブラウザにアクセスしましょう! http://localhost:3000/ さっそくエラー画面が表示されます!! エラー文を解析してデバッグしてください!! もしわからなければこちらのファイルをさんこうにしてください! https://github.com/koya1616/debug1/blob/main/tips 答えは debug1/answers にかいてあります。 https://github.com/koya1616/debug1/blob/main/answers どうでしたか?? ここでは基本的なエラーを発生させました。 大事なことは調べる力や考える力だとおもいます。 Ruby on Rails のデバッグ練習でした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

駆け出しエンジニアの「ポートフォリオどうしよう?」を解決するサービスをリリースしました

はじめに 駆け出しエンジニアのみなさん、ポートフォリオ1作成に悩んでいませんか? 駆け出しエンジニアにとっては、企画から開発まで自力でできる力を示すために、いかにポートフォリオを作り上げるかということが重要です。 しかし、初めての人がゼロから1つのプロダクトを作り上げるのはとても大変です。 みんなはどんなポートフォリオをどんな技術で作っているんだろう? 自分と同じくらいの規模のプロダクトのソースコードを見てみたい そんな悩みを解決するために開発したのが、このポートフォリオ集約サービス「Fledge Hub」です。 https://fledge-hub.com サービスについて サービスに関して登録できる情報は、以下の通りです。 検索は、タイトルなどのフリーワード検索だけでなく、タグ検索も可能です。 なんとなく「Railsを使って診断系サービスを見てみたい」と思ったときは、以下のように検索することができます。 ユーザー一覧から、そのユーザーが作成したサービスを見ることもできます。 こだわりポイント 投稿時にOGPを取得する フォームを見ればわかるのですが、入力項目がかなり多いです。できるだけ入力しなくてもいいように、サービスのURLからOGPを画像として取得するようにしています。 でも、追加でさらにスクリーンショットを登録してもらえるとめっちゃ嬉しいです。 ログイン ログインはできるだけ楽にしたいけど、バリデーションエラーに対応できるようにしたいということで、GitHubログインでデータ取得&登録という動線にしました。これはQiitaを参考にしています。 学習開始日はデフォルトだとGitHubの登録日です。 外部アカウント 投稿者をGitHubのアカウント、Twitterのアカウント、ブログなどと紐付けしたいなと思っていたので、アカウント名 / URLを入力できるようにしています。これもQiitaを参考にしました。 使用技術 Ruby 3.0, Rails 6.1 みんな大好きRailsです。 Hotwire(Turboのみ) フロントの開発にはあまり時間を割きたくなかったのと、DHHが推奨しているということで興味があったので、Hotwireを採用しました。とはいっても、Stimulusは現時点では使っていないのですが。 Turboのおかげで、何も設定しなくてもページ遷移がさくさくになるのが楽ですね。このさくさく感はぜひ体感してください。 ちなみに、ストックボタンの非同期処理はTurboStreamを使いました。 まだStimulusは使っていないのですが、さくさくと開発速度の両立でHotwireはなるほどいい選択肢になるかもしれないと思いました。ただ、DSLなのでわざわざ選ばれにくいというのは納得です。 サービス開発でコスパを求めるならHotwireはありだと思います。私もまだまだ浅瀬ちゃぷちゃぷですが。 Tailwind できるだけ拡張性の高いCSSフレームワークを使いたかったのと、流行っているらしいという興味によって、Tailwindになりました。 CSSを書く感覚でクラスを書けるというのは本当でした。最初はドキュメントやサンプルとにらめっこしていましたが、そのうち大体の感覚でスタイルを当てられるようになりました。 「Tailwind card」とかで検索すれば、ある程度完成されたコンポーネントも出てくるのでよかったです。 クラスを見れば一目瞭然なので、グローバルなCSSが汚れない点は大きなメリットだと感じました。 しかし、共通化しようとするとグローバルにせざるを得ないので(フォーム用のクラスはapplication.scssに定義している)、結局……とはなりました。 あとは、やはりパッと見のクラス表記が汚い。 とはいえ、書きやすさとデザインの自由度でめちゃくちゃ気に入りました。 今後、ある程度自分でデザインをいじるものを開発するならTailwindを使うだろうなと思っています(デザイン雑にするなら他のCSSフレームワークかな)。 共同開発について このサービスは元々私が発案し、なんやかんやがあって、私が卒業したプログラミングスクールRUNTEQ内でのOSSにしました。 開発に携わってくださった方は十数名、リリースまでは半年ほど掛かりました。 業務で学んだコードの書き方を活用できたり、やってみたいと思っていた技術を試すことができたので、個人的に楽しかったです。また、他の人のコードレビューを通して、それぞれの就職先での知見エッセンスを得られたような気もします。 私のわがままを通したところもありますが、みなさんの協力のおかげでリリースすることができました。本当に感謝の気持ちでいっぱいです。 今後も開発したいことはたくさんあるし、他の人の意見から改善もしていきたいと思っています。 最後に 過去にポートフォリオを作った経験のある、駆け出しエンジニアだった方へ。 自分の開発の軌跡を見返すために、そして、未来の駆け出しエンジニアのためにも、ぜひあなたのポートフォリオも登録していただけると嬉しいです。 (サービス終了していても大丈夫です)(駆け出しすぎたエンジニアの投稿も大歓迎です) 駆け出しエンジニア界隈の「ポートフォリオ」とは、技術力などを示す個人開発サービスを指します。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsテスト(RSpec)記事12選

RSpecとは? RspecとはRuby用のテストフレームワークです。RSpec は Gem パッケージとして提供されていますのですぐに導入できます。 記事 RSpecについて書かれている記事たちです。参照しやすいように一箇所にまとめました。 おわりに どんどんテストを書いていきましょう!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む