Rails関連のことを調べてみた2022年10月13日

Rails関連のことを調べてみた2022年10月13日

【解決済み】RailsのHostAuthorizationによってELBのヘルスチェックがhealthyにならない

ポートフォリオをデプロイする際に発生した問題について、備忘録として投稿します。

## 発生した問題
Rails6 + AWSで下記の構成のようなアプリを開発していました。

![インフラ構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2263192/32b8dab2-46ef-7f69-a8c9-85d4cd39d76d.png)

Railsの`HostAuthorization`を利用し、`/api/health_check`というパスでALBからのヘルスチェックを行おうとしました。
しかし、Railsが`403エラー`を返し、ヘルスチェックが失敗してしまいました。

## 原因
Railsの設定は下記のようになっていました。

“`environments/production.rb
onfig.hosts << 'base_domain.com' ``` 原因は、 **「ヘルスチェック時のホスト名が`base_domain.com`でないからエラーになっていた」** というものです

元記事を表示

【Ruby on Rails】CanCanCan の authorize_resource はレコードの権限まではチェックしてくれない

# CanCanCan
Rails でいい感じにアクセス権を確認したり、作成・更新できるかを確認したり、そんなことができる gem です。

https://github.com/CanCanCommunity/cancancan

以下のような記事が参考になると思います。

https://qiita.com/umanoda/items/679419ce30d1996628ed#model%E3%81%AE%E3%81%AA%E3%81%84%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%B8%E3%81%AE%E6%A8%A9%E9%99%90%E8%A8%AD%E5%AE%9A

この gem を導入すると、controller で権限認証が楽にできます。

# authorize!
まず、本題の`authorize_resource`の前に、元となる`authorize!`を見てみます。
“`ruby
#books_controller.rb
def show
@book = Bo

元記事を表示

【Rails】M1 Macでシステムスペックの実行時にNet::HTTPServerException: 404 “Not Found”というエラーが出た場合の対処法

## 発生した問題

M1 Macでシステムスペックを実行したら突然以下のようなエラーが発生し、テストが実行できなくなった。

“`
Webdrivers::NetworkError:
Net::HTTPServerException: 404 “Not Found” with https://chromedriver.storage.googleapis.com/106.0.5249.61/chromedriver_mac64_m1.zip
“`

## 原因
Chromedriverの命名規則が変わった影響らしい。

https://github.com/titusfortner/webdrivers/issues/237

## 解決方法
webdrivers gemを5.2.0以上にアップデートする。

“`
$ bundle update webdrivers

$ bundle show webdrivers
/Users/jnito/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/webdrivers-5.2.0
`

元記事を表示

ログインの有無で処理を変える方法

# はじめに
user_signed_in?メソッドの利用方法を忘れないために記録する

## user_signed_in?メソッドとは
Gemのdeviseを導入しているため、使用できるメソッド。
ログインしているかどうかの判定を行う。

#記載方法
<% if user_signed_in? %>

<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
<%= link_to "投稿する", new_tweet_path, class: "post" %>

<% else %>

<%= link_to "ログイン", new_user_session_path, class: "post" %>
<%= link_to "新規登録", new_u

元記事を表示

【Ruby on Rails】Model の scope で find_by するのはNG

# scope の罠
先日以下のような scope を見ました。
“`user.rb
class User < ActiveRecord::Base scope :foo, -> (bar) do
return if bar.nil?
find_by(bar: bar)
end
end
“`

もちろん使い方しだいではありますが、この動き、ちょっと想定外だったりするので注意です。

`bar` が `nil` で `return` される場合 (`nil` が返る)、
`find_by` で見つからなくて `nil` になる場合、

このとき、scope の戻りは `nil` ではありません。

`User.foo(nil)` は nil ではありません。

`User.all` が返ります。

(正確には default scope が返る)

## なぜ `nil` が返らないのか

どうやら `scope` は `ActiveRecord::Relation` を返すものだと決まっているよう。
なので`nil`が返るときは default scope

元記事を表示

[Rails]実務を通しての実装ノウハウ集

# 1. チェック対象値が指定の範囲に含まれるか(数値・時間)

“`
(【開始値】..【終了値】).cover?(【チェック対象値】)
“`

補足:
– 【開始値】 <= 【チェック対象の値】 <= 【終了値】になっているかをチェックする - **数値的な範囲、日時的な範囲のチェック** に使える - **日時のチェックに使う場合** - 【開始値】、【終了値】のいずれかがnilである場合は、**十分に過去の日時 or 未来の日時** として扱われる - 類似の実装として``【チェック対象の値】.between?(【開始値】, 【終了値】)``ということもできるが、こちらは **【開始値】、【終了値】どちらかがnilである場合エラーとなってしまう** # 2. 配列要素の重複チェック **2.1. どの要素が重複しているかわからなくてもいい場合** ``` # true:重複あり, false:重複なし 【配列】.size != 【配列】.uniq.size ``` **2.2. どの要素が重複しているか知りたい場合** ``` # dup_valuesは

元記事を表示

複数タグの編集機能を実装[Rails]

# 概要
先日、こちらの記事を参考にさせていただき、投稿に紐づいた複数タグ機能を実装しました。

https://qiita.com/ryutaro9595/items/042a1ec713c8c1f2c1d6

そこで今回、投稿編集機能を実装していたとき、タグも編集したいと思い、タグ編集機能を実装しましたので共有させていただきます。
私の実装では、Post(投稿)に対し、Genre(タグ機能)を実装しています。
以下、タグのことをジャンル、もしくはGenreと述べさせていただきます。
スクリーンショット 2022-10-12 13 40 17

# 開発環境
– OS:Amazon Linux2
– Rails 6.1.6.1

# 実装
## アソシエーション
私が行った実装では、タグのことをGenreとして実装していて

元記事を表示

【Ruby】nil or 未定義の場合の代入演算子

メモとして残します。

代入演算子というのかは定かではありませんが、左辺がnil、または存在しない場合のみ、右辺を左辺に代入するという演算子です。

# ■やり方
`hoge = hoge || ‘nilの場合代入される’`
要するに上記を省略して書くと下記のようになる。

“`rb
hoge = nil
hoge ||= ‘代入されるよ’
#>> hoge = ‘代入されるよ’
“`

“`rb
hoge = ”
hoge ||= ‘代入されないよ’
#>> hoge = ”
“`

以上

元記事を表示

エラー文(uninitialized constant)の内容

# はじめに
エラー文でよく見る「uninitialized constant」の意味が翻訳結果とはほど遠いので、記録に残す。

## uninitialized constantについて
「uninitialized constant」のエラー文は、
直訳すると「初期化されていない定数のエラー」という意味だが、
Rubyでは「ファイル名やクラス名が正しくない場合」に表示されるエラー。

元記事を表示

Rails form_withについて

app/views/blogs/new.html.erb
“`
<%= form_with(model: @blog, local: true) do |form| %>

<%= form.label :title %>
<%= form.text_field :title %>
<%= form.label :content %>
<%= form.text_field :content %>

<%= form.submit %>
<% end %>
“`
app/controllers/blogs_controller.rb
“`
class BlogsController < ApplicationController def index end def new @blog = Blog.new end def create Blog.create(titl

元記事を表示

【初心者向け】Railsに出てくるsessionとは??

## 書いた理由
Railsの学習をしていて、sessionの使い方が分からなかったため記事にまとめてみました。
プログラミング初学者のため、間違えていることがあるかもしれません。ご容赦ください?

## 環境
mac m1
Ruby 3.0.1
Ruby on Rails 6.0.3

## sessionとは?
sessionとは主にログイン機能に使用されるもので、ログイン状態を維持させるものです。つまり、ステートフルな通信を実現させるための仕組みとなります。

## sessionを使ってみよう!
1. sessionに値を保存する
セッションはハッシュと同じようにキーとバリューの組み合わせで値を保存します。

“`
session[:user_id] = user.id
“`

1. sessionの値を削除
デリートメソッドの引数にキーを与えて、該当する要素を削除します。

“`
session.delete(:user_id)
“`
結果的にsessionの中身はnilとなります。

## 注意!
sessionは基本

元記事を表示

ActiveRecord 命名規則

rails c を行い、コンソールでモデル名.createでテーブルに保存がされていました。

“`
2.3.0 :001> Blog.create(title: ‘タイトルA’, content: ‘内容A’)
(0.2ms)BEGIN
SQL (0.8ms)INSERTINTO “blogs” (“title”, “content”, “created_at”, “updated_at”)VALUES ($1, $2, $3, $4) RETURNING “id” [[“title”, “タイトルA”], [“content”, “内容A”], [“created_at”, “2017-07-17 05:44:06.209381”], [“updated_at”, “2017-07-17 05:44:06.209381”]]
(3.0ms)COMMIT
=>#

元記事を表示

Rails iframeでサクッと作る地図機能

地図機能を調べると結構な割合でGoogleのAPIがヒットしますが
もっと楽に作れたので、共有です?

# 地図機能 作り方
1. iframeの準備
1. railsのViewで代入

この手順で終わりです!!

# 1. iframeの準備
今回使用するiframeはこちらになります。
“`html

“`
このiframeをカスタマイズしたり、パラメータ(URLのところに出てくるクエリ的なもの)を
いじったりして作成します!

## パラメータの解説
今回使用するGoogleMapのパラメータは以下のようになっています

RailsのER図をMermaid.jsでいい感じに生成する

![](https://storage.googleapis.com/zenn-user-upload/76818a3f6d7d-20221010.png)

**Rails Mermaid ERD**という、Ruby on RailsアプリからMermaidのERDを自由に起こせるGemを作りました。ただERDを生成するだけでなく、共有のしやすさを考慮して作っています。

↓直感的に触れると思うのでデモサイトから触ってみてください。
https://koedame.github.io/rails-mermaid_erd/example.html

ソースコードはGitHubで公開しています。
https://github.com/koedame/rails-mermaid_erd

## 使い方

使い方はインストールしたらコマンドを実行するだけです(詳しいインストール手順は記事の最後に書いています)。

“`bash
$ bundle exec rails mermaid_erd
“`

コマンドを実行すると `./mermaid_erd/index.html` が生成されるの

created_atとupdated_atの表示を変更する方法

# created_atとupdated_atを日本時間へ変更する方法

config/application.rbに以下のコードを記述する

“`config/application.rb
config.time_zone = ‘Tokyo’
“`

“`config/application.rb
require_relative ‘boot’

require ‘rails/all’

# Require the gems listed in Gemfile, including any gems
# you’ve limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module App名
class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defa

シンプルな例で体感するHotwire (2)Turbo StreamsでHTMLをCRUDする

Hotwireの機能のうち、Turbo StreamsもTurbo Frames([前の記事でまとめました](https://qiita.com/shinsuke-kuroki/items/c0cfcdd17c6909a906a3))と同じくページの一部のHTMLによるページの部分更新を実現したものですが、Turbo StreamsはデータでいうCRUDにあたる、内容の追加・更新・削除をしやすくしてあります。こちらも見てみましょう。

– Railsでの用例の話をします
– 記事の読者はRailsの基礎は知っているものとします
– Rails7.0.4 + Ruby3.1.2 で動作させています

## おおまかな流れ

HTTPに載せて使用する場合は、[Turbo Framesのおおまかな流れ](https://qiita.com/shinsuke-kuroki/items/c0cfcdd17c6909a906a3#%E3%81%8A%E3%81%8A%E3%81%BE%E3%81%8B%E3%81%AA%E6%B5%81%E3%82%8C)と同じく、サーバーがレスポンスで返してきた

シンプルな例で体感するHotwire (1)Turbo FramesでHTMLの部分更新

Hotwireにはいくつかの機能がありますが、まずはとても効果がわかりやすいところとしてTurbo FramesでHTMLを部分更新できるので、これを見てみましょう。

– Railsでの用例の話をします
– 記事の読者はRailsの基礎は知っているものとします
– Rails7.0.4 + Ruby3.1.2 で動作させています

## おおまかな流れ

まずは概要を頭に入れて、流れをイメージしやすくしましょう。

以下は、

– 基本的なRailsアプリ
– Rails+JS(Reactなど)アプリ
– Rails+Turbo Framesアプリ

の3つの、処理の違いをシーケンス図に表したものです。(PlantUMLで書きました)

“`plantuml
@startuml
participant “Rails Server”
participant Browser

group 基本的なRailsアプリの典型的な動作
Browser -> “Rails Server”: リクエストを送る
activate “Rails Server”
“Rails Server”

RSpecを読む、駆け出しエンジニア。

## 駆け出し歴、1年5ヶ月
Railsで開発を行っている駆け出しエンジニアです。
RSpecでのテストを書いているのですが、自身がテストを書くときに意識している **文脈** について
共有したいと思い記事にしました。

駆け出したばかりの頃の自分へ向けた内容になっています :walking_tone1:

## 例とするテストコード
下記のようなテストコードがありました。
今日はこれを日本語で読んで行きたいと思います。

“`rb
describe “drink?” do
subject { UniversityStudent.new(age: age).drink? }

context “19歳の場合” do
let(:age) { 19 }

it “お酒を飲んではいけないこと” do
expect(subject).to be_falsey
end
end

context “20歳の場合” do
let(:age) { 20 }

it “お酒を飲んでもいいこと” do
expect(sub

【Ruby on Rails】booleanで実装するときとenumを使うときの違いは?(データ型一覧有り)

# はじめに
Ruby on Railsでポートフォリオ作成にあたりテーブル定義書を作成したが、booleanで実装するときとenumを使うときの違いがわからなかったため調べた結果を記録に残しておく。
また、今後のためにデータ型はどんなものがあるのか一覧にしておくことで、調べる時間の短縮を図る。
(実際に何度も実装する内によく使うデータ型は自然と覚えていくと思うが、現時点ではそのレベル感には到達していないため、記録に残しておきます。)

# データ型一覧

– string : 文字列(1 〜 255文字)
– text : 長い文字列(1 〜 4,294,967,296文字)
– integer : 整数型(4バイト)
– bigint : 整数型(8バイト)
– float : 数値(浮動小数点数)
– decimal : 固定長整数型(精度の高い小数)
– datetime : 日付と時刻(1000-01-01 00:00:00.000000 〜 9999-12-31 23:59:59.999999)
– time : 時刻 (-838:59:59 〜 838:59:59)

Railsでカラムにnull制約を後から設定する

# 目的
Postテーブルにある既存のtitleカラムに“`null:false“`を追加すること

# 設定方法
### migartionファイルの作成
“`ruby
$ rails g migration ChangePresenseTitleOfPosts

create db/migrate/20221008061033_change_presense_title_of_posts.rb
“`

### migrationファイル追記
“`20221008061033_change_presense_title_of_posts.rb
class ChangePresenseTitleOfPosts < ActiveRecord::Migration[7.0] def change change_column :posts, :title, :string, null: false end end ``` ### データベース反映 ```Ruby rails db:migrate ``` # まとめ 書き方としては ```ruby chang