20210125のRailsに関する記事は12件です。

rails newするときのoptionなにしたらええんやっけ?となったとき

$ bundle exec rails help
Usage:
  rails new APP_PATH [options]

Options:
      [--skip-namespace], [--no-skip-namespace]              # Skip namespace (affects only isolated applications)
  -r, [--ruby=PATH]                                          # Path to the Ruby binary of your choice
                                                             # Default: /Users/shoutaro/.rbenv/versions/2.7.2/bin/ruby
  -m, [--template=TEMPLATE]                                  # Path to some application template (can be a filesystem path or URL)
  -d, [--database=DATABASE]                                  # Preconfigure for selected database (options: mysql/postgresql/sqlite3/oracle/frontbase/ibm_db/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc)
                                                             # Default: sqlite3
      [--skip-gemfile], [--no-skip-gemfile]                  # Don't create a Gemfile
  -G, [--skip-git], [--no-skip-git]                          # Skip .gitignore file
      [--skip-keeps], [--no-skip-keeps]                      # Skip source control .keep files
  -M, [--skip-action-mailer], [--no-skip-action-mailer]      # Skip Action Mailer files
      [--skip-action-mailbox], [--no-skip-action-mailbox]    # Skip Action Mailbox gem
      [--skip-action-text], [--no-skip-action-text]          # Skip Action Text gem
  -O, [--skip-active-record], [--no-skip-active-record]      # Skip Active Record files
      [--skip-active-storage], [--no-skip-active-storage]    # Skip Active Storage files
  -P, [--skip-puma], [--no-skip-puma]                        # Skip Puma related files
  -C, [--skip-action-cable], [--no-skip-action-cable]        # Skip Action Cable files
  -S, [--skip-sprockets], [--no-skip-sprockets]              # Skip Sprockets files
      [--skip-spring], [--no-skip-spring]                    # Don't install Spring application preloader
      [--skip-listen], [--no-skip-listen]                    # Don't generate configuration that depends on the listen gem
  -J, [--skip-javascript], [--no-skip-javascript]            # Skip JavaScript files
      [--skip-turbolinks], [--no-skip-turbolinks]            # Skip turbolinks gem
  -T, [--skip-test], [--no-skip-test]                        # Skip test files
      [--skip-system-test], [--no-skip-system-test]          # Skip system test files
      [--skip-bootsnap], [--no-skip-bootsnap]                # Skip bootsnap gem
      [--dev], [--no-dev]                                    # Setup the application with Gemfile pointing to your Rails checkout
      [--edge], [--no-edge]                                  # Setup the application with Gemfile pointing to Rails repository
      [--rc=RC]                                              # Path to file containing extra configuration options for rails command
      [--no-rc], [--no-no-rc]                                # Skip loading of extra configuration options from .railsrc file
      [--api], [--no-api]                                    # Preconfigure smaller stack for API only apps
  -B, [--skip-bundle], [--no-skip-bundle]                    # Don't run bundle install
  --webpacker, [--webpack=WEBPACK]                           # Preconfigure Webpack with a particular framework (options: react, vue, angular, elm, stimulus)
      [--skip-webpack-install], [--no-skip-webpack-install]  # Don't run Webpack install

helpを見ましょう

$ bundle exec rails new . -B -d mysql --skip-turbolinks --skip-test --no-skip-webpack-install -J

こんな感じでつくりました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsのバリデーション

バリデーションとは

正当性を実証(確認)すること。
例えば、新規登録フォームでユーザー名が入力されていなかったら登録できない、
メールアドレスが正規の型でない等を検知する。

新規登録時に名前、メールアドレスが入力されているか検証する

app/models/user.rbファイルに記入する。
validatesメソッドに presence:trueという引数を与えて使うことで検証できます。

app/models/user.rb
class User < ApplicationRecord
  validates :name, presence: true
  validates :email, presence: true
end

長さを検証する

上記のコードにlenghtを追加します。
今回は名前を50文字、メールアドレスを255文字を制限とします。

app/models/user.rb
class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  validates :email, presence: true, length: { maximum: 255 }
end

フォーマットを検証する

メールアドレスにおなじみのパターンuser@example.comに合っているかを検証します。
無効なメールアドレスにはマッチしない正規表現を組み立てる必要があります。
正規表現とは、一定の規則に従って特定の文字列(群)を集合の要素として表す表記法。
コンピューターで,テキスト処理に使われる。
正規表現がこちら。
/\A[\w+-.]+@[a-z\d-.]+.[a-z]+\z/i

暗号みたいでわかりずらいので表を置いときます。

正規表現 意味
/\A[\w+-.]+@[a-z\d-.]+.[a-z]+\z/i (完全な正規表現)
/ 正規表現の開始を示す
\A 文字列の先頭
[\w+-.]+ 英数字、アンダースコア(_)、プラス(+)、ハイフン(-)、ドット(.)のいずれかを少なくとも1文字以上繰り返す
@ アットマーク
[a-z\d-.]+ 英小文字、数字、ハイフン、ドットのいずれかを少なくとも1文字以上繰り返す
. ドット
[a-z]+ 英小文字を少なくとも1文字以上繰り返す
\z 文字列の末尾
/ 正規表現の終わりを示す
i 大文字小文字を無視するオプション
app/models/user.rb
class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX }
end

一意性を強制

メールアドレスの一意性を強制するために、validatesメソッドの:uniquenessオプションを使います。
uniquenessは登録されているメールアドレスは登録できないことを検証します。

pp/models/user.rb
class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness:true
end

email属性を小文字に変換してメールアドレスの一意性を保証

emailを小文字に変換はemail.downcaseを使います。
今回の場合は、オブジェクトが保存される時点で処理を実行したいので、before_saveというコールバックを使います。
ユーザーがデータベースに保存する前にemail属性を強制的に小文字に変換します

app/models/user.rb
class User < ApplicationRecord
  before_save { self.email = email.downcase }
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: true
end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

アプリケーションの作成〜立ち上げ

アプリケーション作成の流れ

①アプリケーションを保存するためのディレクトリを作成
②新規のrailsアプリケーションを作成
③データベースを作成
④アプリのケーションの立ち上げ

①アプリケーションを保存するためのディレクトリを作成

ホームディレクトリから新規フォルダで適当な名前のディレクトリを作成する

②新規のrailsアプリケーションを作成

cd ①のディレクトリ
#①のディレクトリに移動する

rails railsのバージョン new Career_up -d mysql
#railsのバージョンを指定して、Career_upを作成

cd Career_up
#Career_upのディレクトリに移動する

pwd
#現在のディレクトリに移動

③データベースを作成

rails db:create
#データベースを作成する

④アプリのケーションの立ち上げ

cd Career_up
#Career_upのディレクトリに移動する

rails s
#Career_upのディレクトリ上記のコマンドを打つ

以上です

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Model.human_attribute_name(:カラム名)について(Rails)

経緯

普段viewでよく見かけるタイトルについて自分の学習用のメモ的な感じです。

Model.human_attribute_name(:カラム名)とは?

ActiveRecord::Base のクラスメソッドで内部的にI18nモジュールを
利用してくれるというものです
参照先は config/locales/ja.ymlです。

ja.yml
---
ja:
  activerecord:
    errors:
      messages:
        record_invalid: 'バリデーションに失敗しました: %{errors}'
        restrict_dependent_destroy:
          has_one: "%{record}が存在しているので削除できません"
          has_many: "%{record}が存在しているので削除できません"
    models:
      task: タスク
    attributes:
      task:
        id: ID
        name: 名称
        description: 詳しい説明
        created_at: 登録日時
        updated_at: 更新日時
      user:
        name: 名前
        email: メールアドレス
        admin: 管理者権限
        password: パスワード
        password_confirmation: パスワード(確認)
        created_at: 登録日時
        updated_at: 更新日時

viewではこんな感じで使います。

 th= Task.human_attribute_name(:name)

この場合ですと「名称」ですね!

最後に

ymlの書き方は特徴があって毎回躓きます。。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails で 特定のページに別のレイアウト(デザイン)を指定する方法

始めに

ウェブアプリをつくっていると、それぞれのページでレイアウト(デザイン)を変更したいことがあります。
例えば、下層ページのデザインは共通で良いが、トップページだけは別のデザインにしたいといった場合です。

環境

% rails -v
Rails 6.1.1

% ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20]

実装

Slimを使って効率的にhtmlを記述できるにします。
また、Sassを使って効率的にスタイルシートを書けるようにします。
そのために、Gemfileに以下を追記します。

# Gemfile
gem 'slim-rails'                     
gem 'sass-rails'

下層ページ全体

下層ページ全体で共通して使う スタイルシート application.scss は次のように書きます。

// app/assets/stylesheets/application.scss
@import 'header'; // ヘッダー用のscssを取り込みます。
@import 'footer';
// app/assets/stylesheets/_header.scss
// ヘッダー用のSCSSをいろいろ書きます。
header {
  background: yellow;
  color: red; 
}

ここで書いた スタイルシート application.scss は、下層ページ全体で使いたいので、
下層ページ全体で共通して使うレイアウトファイル application.html.slim に次のように書いて読み込みます。

/ app/views/layouts/application.html.slim
doctype html
html
  head
    meta charset="utf-8"
    / sprocket管理下のcssを読み込む
    / <link rel="stylesheet" href="app/assets/stylesheets/application.css">
    / と書くのと(だいたい)同じ意味です。
    = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'

  body
    / ヘッダーの内容は、下層ページ全体で共通なので、
    / app/views/layouts/_header.html.slim に 記しておき、表示させます。
    = render 'layouts/header'

    / 各ページ(index.html.slimやedit.html.slimなど)の内容がここに挿入される
    = yield

    / フッター
    = render 'layouts/footer'

    / 開発中のデバッグ情報を表示
    - if Rails.env.development?
      = debug(params)

/ app/views/layouts/_header.html.slim
header ヘッダー

一般的なウェブサイトでは、index.html を 次のような感じで書くかと思います。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <header>ヘッダー</header>
    内容いろいろ
    <footer>フッター</footer>
  </body>
</html>

上のレイアウトファイルと良く似ていることが分かるかと思います。

トップページ

トップページだけ、別のデザインにしたいときには、二つの方法があります。

1) トップページのコントローラ名と同じ名前のレイアウトファイルを用意する。

class TopController < ApplicationController
  def index
  end
end
// app/assets/stylesheets/top.scss
// (略)
/ app/views/layouts/top.html.slim
doctype html
html
  head
    meta charset="utf-8"
    / トップページ専用のscssを読み込みます。
    = stylesheet_link_tag 'top', media: 'all', 'data-turbolinks-track': 'reload'

  body
    / トップページ専用のデザインになるよう、slim(html)でいろいろ書きます。
    = yeild

2) layout メソッドで、適用するレイアウトファイル名を指定する

Welcome コントローラ だけれども、
使用するレイアウトファイル名は、top.html.slimを使いたいときには、
layout メソッドを使って、使用するレイアウトファイル名を指定します。

class WelcomeController < ApplicationController
  layout 'top'

  def index
  end
end

layout 'top' と書かなければ、
1. welcome.html.slim があればそれを、
2. なければ、application.html.slim のレイアウト(デザイン)になります。

参考

Rails を学ぶために、いろいろな書籍がありますが、次の順番で学んでいくと理解しやすいかと思います。

【初心者向け】
0. RubyとRailsの学習ガイド
1. Railsの教科書

【中級者向け】
2. 現場で使えるRuby on Rails 速習実践ガイド
3. Ruby on Rails チュートリアル

【上級者向け】
4. Ruby on Rails 実践ガイド

また、Ruby on Rails ガイドも、Railsの個々の機能に関して詳しく説明が為されておりお薦めです。

皆様のご参考になれば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Railsでアプリを作ってみよう⑤

モデルとデータベースの役割

入力した情報などを保存しておくことができなければ
アプリケーションとして成り立ちません。

今回は情報を保存するためのデータベースとモデルについて学習していきましょう。

テーブル

データベース内に作成される表形式でデータを収納する仕組みです。
全ての情報がごちゃ混ぜに保存されていると管理ができませんので
情報の種類ごとにテーブルを作成し管理します。

図1
image.png

レコードとカラム

表形式のテーブルに置いて行はレコード列はカラムといいます。

図2
image.png

モデル

MVCの役割の一つで
データベースにどんな情報を保存するか、またどんな情報を取得してくるかを管理する役割を
持つのがモデルです。テーブルごと対応するモデルで管理されています。
図3
image.png

図4
image.png

それではモデルを作成していきましょう

rails g model コマンド

rails g model モデル名(単数形)

コントローラーは複数形で名前を付けましたがモデルは単数形で名前をつけましょう。命名規則です。

postモデルを作ってみましょう。

rails g model post

それではテーブルにどんなカラムを設定するかなど仕様を決めていきましょう。

マイグレーション

テーブルの仕様書です。このファイルの中にどのようなテーブルにするか書き込み反映します。
マイグレーションファイルはモデル作成と同時に自動で作られます。開いてみましょう。

class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts do |t|
    #ここに設定したいカラム名や種類などをかく
      t.timestamps
    end
  end
end

マイグレーションファイルにはカラム名とカラムの型という物を記述します。
カラムの型は書き方が決まっていて複数の種類があります。用途によって使い分けます。

カラムの型 説明 用途
integer 数値 金額、回数など
string 文字(短文) ユーザー名、メールアドレスなど
text 文字(長文) 投稿文、説明文など
boolean 真か偽か はい・いいえの選択、成功・失敗のフラグなど
datetime 日付と時刻 作成日時、更新日時など

テキスト型のcommentカラムを作ってみましょう

class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts do |t|
      t.text :comment
      t.timestamps
    end
  end
end

t.の後ろに記述されているのがカラムの型、その右側にシンボルで記述されているのがカラム名になります。
ここで作成したのはtext型のcommentカラムになります。

マイグレーションファイルに記述しただけだとまだデータベースに反映されないので
マイグレーションを下記のコマンドで実行することが必要です。

rails db:migrate

これでpostsテーブルに反映されました。

マイグレーションを変更したい時

一度マイグレーションを実行するとマイグレーションファイルの中身を書き換えただけでは
変更が反映されませんロールバックしてから記述を修正し再度マイグレーションを実行しましょう。

rails db:rollback

rails db:migrate:statusコマンド

マイグレーションが実行済みであるかを確認するコマンド
Statusの部分にはマイグレーションが実行されているかいないかが示されています。
upなら実行中、downなら実行されていませんロールバックがうまく実行されていればdownになっています。

image.png

image.png

Sequel Pro

データベースを可視化できるツールです。
テーブル情報やカラム名などの情報を確認することができます。

写真2
image.png

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker開発環境

はじめに

現在開発中のアプリにDockerを導入したのでアウトプットします。

環境

Ruby on Rails '6.0.0'
Ruby '2.6.5'
MySQL '5.6.47'

Dockerfile

開発中アプリのルートディレクトリにDockerfileを作成します。

Dockerfile
FROM ruby:2.6.5

RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       libpq-dev \
                       nodejs

RUN mkdir /アプリ名
WORKDIR /アプリ名

ADD ./Gemfile /アプリ名/Gemfile
ADD ./Gemfile.lock /live_search/Gemfile.lock

RUN gem install bundler
RUN bundle install
ADD . /アプリ名

docker-compose.yml

docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.6.47
    environment:
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - "4306:3306"
    volumes:
      - ./db/mysql-data:/var/lib/mysql

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/アプリ名
    ports:
      - "3000:3000"
    depends_on:
      - db

entrypoint.sh

entrypoint.sh
set -e

rm -f /myapp/tmp/pids/server.pid

exec "$@"

database.yml

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
  socket: /tmp/mysql.sock

password: password
host: db
を追加

コンテナを作成

ターミナル
% docker-compose build

DB作成、migrationの実行

ターミナル
% docker-compose run web bundle exec rake db:create
% docker-compose run web bundle exec rake db:migrate

コンテナを起動

ターミナル
% docker-compose up 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby on Rails Tutorial】6章のテストでエラー

【Ruby on Rails Tutorial】6章のテストでエラー

Ruby on Rails Tutorial 6章の「リスト 6.10」を実行。
すると、あるエラーが発生した。
その後はいつも通りライアーゲームのBGMが脳内で流れると共に膝から崩れ落ちて就寝。
次の日の朝「直すか……」

目次

  1. どういうエラー?
  2. 解決法は?
  3. 参考文献

どういうエラー?

以下のようなエラーが発生。

ターミナル
PS C:\Users\(ユーザー名)\Desktop\Web\Ruby\rails_tutorial\sample_app2> rails test:models

ansi: 'gem install win32console' to use color on Windows
LoadError: UNIXServer is required
per.rb:9:in `<class:TestCase>'
C:/Users/(ユーザー名)/Desktop/Web/Ruby/rails_tutorial/sample_app2/test/test_helper.rb:7:in `<top (required)>'
C:/Users/(ユーザー名)/Desktop/Web/Ruby/rails_tutorial/sample_app2/test/models/user_test.rb:1:in `<top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => test:models
(See full trace by running task with --trace)

 エラー文を読み解いてみる→それで頑張ってググるなどした。しかし、そのように出てきた情報で解決したわけではない。
 なんか前にも似たようなことがあった気がすると考え、それをやってみたら直った。それを記す。

解決法は?

まず悪さをしていたのは以下の「これを直すんや」の部分である。
ちなみに正確に言うと悪いのはこいつではない。
テストコードのテストを1つずつやってみたら、すんなりと成功(GREEN)するのだ。
つまり、悪さをしているのは並行処理を行うことでエラーが起きるRailsの方である。

system>test_helper.rb
ENV['RAILS_ENV'] ||= 'test'
require_relative "../config/environment"
require "rails/test_help"

class ActiveSupport::TestCase
  # Run tests in parallel with specified workers
  parallelize(workers: :number_of_processors, with: :threads) # ←これを直すんや

  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
end

system>test_helper.rb
  parallelize(workers: 1) # ←こうするんや

すると

 PS C:\Users\(ユーザー名)\Desktop\Web\Ruby\rails_tutorial\sample_app2> rails test:models
Started with run options --seed 34075


  /0: [=---=---=---=---=---=---=---=---=---=-] 0% Time: 00:00:00,  ETA: 
  2/0: [                                     ] 0% Time: 00:00:00,  ETA: 
  2/1: [==================                  ] 50% Time: 00:00:00,  ETA: 
  2/2: [===================================] 100% Time: 00:00:00, Time: 
00:00:00

Finished in 0.23506s
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips

テスト成功。

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

No template for interactive request IdeasController#index is missing a template for request formats: text/htmlというエラーが出た

rails s を行ったら以下のエラーが出た

No template for interactive request
IdeasController#index is missing a template for request formats: text/html

NOTE!
Unless told otherwise, Rails expects an action to render a template with the same name,
contained in a folder named after its controller. If this controller is an API responding with 204 (No Content),
which does not require a template, then this error will occur when trying to access it via browser,
since we expect an HTML template to be rendered for such requests. If that's the case, carry on.

調べるとどうやらIdeasコントローラーに対応するビューがないという意味のようだ。
view以下のideasディレクトリの名前がいつの間にか(いじっていたみたい、、)変わっていたのでideasに変更したら解決した。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails RSpecテストを導入しよう!

経緯

Railsチュートリアルなどではminitestが使われているが
実際の現場ではRSpecを用いたテストを行っているため
今回はRailsにRSpecを導入するまでの手順を乗せていこうと思います。

利用するテスト用ライブラリ

1 RSpec
2 Capybara
3 FactoryBot

RSpecのインストールと初期準備

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'rspec-rails', '~>3.7'
end

次に以下のgenereteコマンドを実行します。

bundle
bin/rails g rspec:install
=>Running via Spring preloader in process 4359
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

最後にminitest用のtestディレクトリを削除します。

rm -r ./test

Capybaraの初期準備

spec/spec.helper.rbを以下のように編集します。

spec.helper.rb
require 'capybara/rspec'

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :selenium_chrome_headless
  end

FactoryBotのインストール

テストデータを作成支援してくれるFactoryBotを導入します。
Gemfileに以下のように追記します。

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'factory_bot_rails', '~> 4.11'
end

導入に向けての手順は以上となります。

最後に

ここまで見てくれてありがとうございました!
具体的な書き方については別の機会で解説していこうかなと思います!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker + CircleCI + Rails】Missing secret_key_base エラー

環境

Ruby 2.7.1
Rails 6.0.3.4

CircleCIを使ってECSへデプロイ時に以下のようなエラーが発生

rake aborted!
ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`

結論

Railsのmaster.keyをCircleCIの環境変数に設定しconfig.ymlとDockerfileに設定した環境変数を渡す事で解決しました。

Step1

CircleCI環境変数設定
nameをRAILS_MASTER_KEYとし、
valueにmaster.keyの値を入力

Step2

Dockerfileに追記

Dockerfile
# 追記
ARG RAILS_MASTER_KEY
ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY}

Step3

CircleCIの設定

.circleci/config.yml
      - aws-ecr/build-and-push-image:
          # 追記
          extra-build-args: '--build-arg RAILS_MASTER_KEY=${RAILS_MASTER_KEY}'

extra-build-argsで設定する事でCircleCI内で設定した環境変数をRails側でENVとして受け取る事が出来るとのことです。

参考にさせていただいた記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【M1チップ】Homebrew経由でのRubyインストールに苦戦した

概要

プログラミング勉強真っ只中の私ですが、先日M1チップ搭載のMacbook Proを購入しました。
そこでRuby on Railsの環境構築をしようとしたところ苦戦しましたが、初心者の私でもなんとか出来たのでやったことを残しておきます。
(最初はHomebrewって何?美味しいの?ってレベルでした)

参考にさせていただいた記事
https://qiita.com/aiorange19/items/5ffaefc85f912f60c2fa

動作環境

・Macbook Pro (13-inch, M1, 2020)
・macOS Big Sur (ver11.0.1)

Xcodeをインストールして無い人は予めインストールしておくと幸せになれるかもしれません。
(App StoreからDL出来ます)
容量約12GBなのでめっちゃ時間かかった。

Homebrewのインストール

Homebrewをインストールします。
https://brew.sh/index_ja

公式ドキュメントにも記載があるように、M1チップのMacでは「/opt/homebrew」にインストールすることが推奨されているので、そうしましょう。
自分の場合は何も考えずに公式サイトのコードをコピペして自動的に「/opt/homebrew」にインストールされましたが...。

(訳)
ただし、macOSIntelでは/ usr / local、macOSARMでは/ opt / homebrew、Linuxでは/home/linuxbrew/.linuxbrewにインストールしてください。

予めディレクトリを作っておいて、インストール先を指定した方が良いかもしれません。

% cd /opt
/opt % sudo mkdir homebrew
/opt % curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

brewコマンドが打てない

しかし、このままだとbrewコマンドが打てなかった

% brew -v
zsh: command not found: brew

で、ここで最初の壁にぶち当たりましたが、どうやらPATHというものを通さなければならないらしい。
PATHを通すためには「.zshrc」というファイルにその旨のコードを記述する必要があるっぽいんですけど...

% ls -a
.               Documents           Music               Public              Downloads
..              Dropbox             .DS_Store           Movies              Pictures
Library         Desktop             .adobe              .zsh_history        .cups
.zsh_sessions   .dropbox            .Trash              Creative Cloud Files
.local

そのファイルが無い\(^o^)/

無くて焦りましたが、なかったら作れば良いということで作りました。
作成したら、PATHを通すコードを記述します。

% touch .zshrc
% open ~/.zshrc

# .zshrcに下記を記述
export PATH=/opt/homebrew/bin:$PATH

# またはコマンドラインで下記を実行
% echo 'export PATH=/opt/homebrew/bin:$PATH' >> .zshrc

# .zshrcが編集できたら設定を反映させるために下記を実行
% source .zshrc

brewコマンドが使えるか確認してみる。

% brew -v
Homebrew 2.7.5  # Homebrewのバージョンが表示されればOK

無事PATHを通せました。

rbenvでRubyのインストール

Homebrewがインストール出来たら、Rubyのバージョン管理ができるようにrbenvをインストールします。

% brew install rbenv

これも先ほどと同じようにPATHを通す必要があるので、.zshrcに追記します。

% open ~/.zshrc
# 下記を記述
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

# またはコマンドラインで下記を実行
% echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> .zshrc
% echo 'eval "$(rbenv init -)"' >> .zshrc

# 設定を反映
% source .zshrc

これでRubyインストールの準備完了です。

Rubyのインストール

# 公開されている(DL可能な)Rubyのバージョン一覧を確認
% rbenv install -l
2.5.8
2.6.6
2.7.2
3.0.0
jruby-9.2.14.0
mruby-2.1.2
rbx-5.0
truffleruby-21.0.0
truffleruby+graalvm-21.0.0

2020年12月25日にRuby 3.0.0が公開されましたが、ここでは2.7.2
をインストールしました。
Ruby 3.0.0はなんか動作が早くなったとか...。
もうちょっと勉強したらアップデートしようと思います。

ということでRubyをインストール

% rbenv install 2.7.2

、、、しようとしましたがなぜか上手くいかない。

いろいろ調べると、openssl関連で上手くいっていないようでした。
とりあえずインストールを試みましたが...

% brew install openssl
Error: /opt/homebrew/opt/openssl@1.1 is not a valid keg

なんやこれ...
このエラー解消に結構時間がかかってしまいました。

結果、/opt/homebrew/Cellarに作られてたopenssl@1.1というフォルダが空だったので、一度削除したらインストール出来ました。
スクリーンショット 2021-01-25 0.48.52.png

インストール出来ましたが、また.zshrcを編集してPATHを通します。

% which openssl
/usr/bin/opensl  # homebrewへPATHを通しましょう

# .zshrcに下記を追記
export PATH="/opt/homebrew/opt/openssl@1.1/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@1.1/lib/pkgconfig"
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=/opt/homebrew/opt/openssl@1.1"

# 設定を反映
% source .zshrc

# 再度opensslの場所を確認
% which openssl
/opt/homebrew/opt/openssl@1.1/bin/openssl

% openssl version
OpenSSL 1.1.1i  8 Dec 2020  # ちゃんとインストール出来てる

# homebrewへリンクを通す
% brew link openssl

これでようやくRubyをインストールできるはず!

% rbenv install 2.7.2
Downloading ruby-2.7.2.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.2.tar.bz2
Installing ruby-2.7.2...
ruby-build: using readline from homebrew

BUILD FAILED (macOS 11.0.1 using ruby-build 20210119)

Inspect or clean up the working tree at /var/folders/p8/krxwz5vn6ld7l4_bc2g1xnbr0000gn/T/ruby-build.20210124030531.27274.KLMWnZ
Results logged to /var/folders/p8/krxwz5vn6ld7l4_bc2g1xnbr0000gn/T/ruby-build.20210124030531.27274.log

Last 10 log lines:
checking for off_t... yes
checking char bit... 8
checking size of int... 4
checking size of short... 0
checking size of long... 0
checking size of long long... configure: error: in `/var/folders/p8/krxwz5vn6ld7l4_bc2g1xnbr0000gn/T/ruby-build.20210124030531.27274.KLMWnZ/ruby-2.7.2':
configure: error: cannot compute sizeof (long long)
See `config.log' for more details

You have not agreed to the Xcode license agreements, please run 'sudo xcodebuild -license' from within a Terminal window to review and agree to the Xcode license agreements.

...あれ?
最後を見ると、Xcodeインストールしとけや!って書いてありますね。
はい。自分は最初にインストールしてなかったのでここでまた無駄なダウンロード待ち時間が発生しました。

3度目の正直

Xcodeをインストールし、再度実行。さすがに頼む。

% rbenv install 2.7.2
Downloading ruby-2.7.2.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.2.tar.bz2
Installing ruby-2.7.2...
ruby-build: using readline from homebrew
Installed ruby-2.7.2 to /opt/homebrew/opt/rebind/versions/2.7.2

出来たーーー!!

あとは下記の流れに沿って...

% rbenv versions
* system (set by /opt/homebrew/opt/rebind/version)
  2.7.2

% rbenv rehash

% rbenv global 2.7.2

% rbenv versions
  system
* 2.7.2 (set by /opt/homebrew/opt/rebind/version)

% ruby -v
ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [arm64-darwin20]

これでRubyのバージョン切り替えができるようになりました!

Ruby on Railsのインストール

Railsもインストールしておきましょう。

% gem install rails
# バージョン指定しなければ最新版がインストールされる...と思います。

# 最後に一通り更新しておく
% rbenv rehash
% source ~./zshrc

# Railsのバージョン確認
% rails -v
Rails 6.1.1

これでRuby on Railの環境も整いました!

ここまで長かった...

環境構築って大変

プログラミングを挫折する人が多い理由の一つに環境構築が大変、というのをよく目にしますが、よく分かった気がします。笑
しかし、色々根気強く調べながらやっていけばなんとかなる!とも思いました。
先輩エンジニアの方々の情報にはとても感謝です。

まだまだ駆け出しの駆け出しですが、もっと頑張るぞ〜

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む