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

Rails関連のことを調べてみた2022年11月04日
目次

AWS(S3)に画像をアップロードする

# はじめに
AWS(S3)に画像データを保存する必要性や手順をまとめたいと思います。
現状、herokuを用いてアプリのアップロードを行なっていますが、アップロードされた画像はアプリケーションのディレクトリに保存されていました。
しかし、ユーザーがアップロードした画像データは、アプリがデプロイまたは再起動(24時間に1回自動で行われる)される度に、消えてしまう仕様になっています。
そこで、ストレージサービス(画像等の膨大になるであろうデータを別途保管できる場所、サービスのこと)を利用することで、画像を長期的に保存することができるようになります。
ストレージサービスには様々な種類がありますが、今回はAWSが提供しているS3というサービスを使用します。

## S3(Amazon Simple Storage Service)とは
S3とは、AWSが提供するサービスの一つです。
(インターネット上にデータを保存する箱を借りられるサービスであるとイメージをすると良い。)
S3を利用することで、画像を保存したり、保存してある画像を取得したりすることができます。
S3に保存されたデータは実在の

元記事を表示

【Rails,Rspec】deviseによる認証機構のテストを書こうと思う。

# rspecの設定
deviseによる認証機構について、とりあえず手始めに、model specを書いていこうと思う。
まずRSpecを導入するために以下の通りgemをinstallする。(今回、開発環境にはdockerを使用している)
“`ruby:Gemfile
gem ‘rspec-rails’
gem “factory_bot_rails”
“`
“`:terminal
$ docker-compose exec app bundle install
“`

“`:terminal
$ docker-compose exec app bundle exec rails g rspec:install
“`

# rails_helper.rb の追記
“`ruby:spec/rails_helper.rb
# This file is copied to spec/ when you run ‘rails generate rspec:install’
require ‘spec_helper’
ENV[‘RAILS_ENV’] ||= ‘test’

元記事を表示

VSCode使っている時にActiveSupport::MessageEncryptor::InvalidMessageが出たら最初に疑うこと

## 結論
各.encファイル内でvscodeによる自動改行が入っており、その改行のせいでうまく動いていない可能性があるのでVSCodeの設定を見直す

## 起こったこと
リモートリポジトリからpullした後にrailsコマンドを使用すると

“`ターミナル
ActiveSupport::MessageEncryptor::InvalidMessage
“`
のエラーが出力されるようになりました。

## 調べたこと
まずこのエラーは
“`ターミナル
ActiveSupport::MessageEncryptor::InvalidMessage
“`
本来セットになっているはずの暗号化されているファイル(hoge.yml.enc)とそれに対応するキー(hoge.key)が一致していないのが原因
扉の鍵穴と鍵が一致していないのが原因である。

詳しくは↓↓
https://hirocorpblog.com/rails-credentials-master/

## 原因
今回起きたことは
vscodeの設定で自動で改行が入り、その改行のせいでファイルとキーが一致しなくなて

元記事を表示

【Ruby ブロック引数】メソッド.(&block)の引数の「&」ってなに?

# はじめに
“`
def block_execute(&block) # ← ここの引数の「&」の意味がわからない
puts “block.call”
end

block_execute do
puts “blockを実行”
end
“`
def block_execute(&block)
これを見て、(&block)ってどんな引数だよ!!

と思ったので調べました。

# 結論
(&block)の「&」がついた引数は、ブロック引数と呼ばれるものです。

# 解説
ブロック引数の前にブロックとは何か?

### ブロックとは?
メソッド実行時に、そのメソッドの引数として渡せる「処理のかたまり」のこと。
今回で言うとここ↓
“`
block_execute do
puts “blockを実行”
end

または、
block_execute { puts “blockを実行” }
“`

ブロックは
* do ~ end で囲まれた処理のかたまり
* {} で書くことも可能
* メソッドに渡すためだけに存在する

### ブロック引数とは?
ブロックを受け取る専

元記事を表示

kaminariを使ったページネーションの作り方

## 初めに
Gemfileに下記のkaminariを追加してあげます。
追加したらbundle installを忘れないようにしましょう。

“`
gem ‘kaminari’,’~> 1.2.1′
“`
“`
$ bundle install
“`
bundle installをしたら次にkaminariの設定ファイルを作成する為に下記のコマンドをターミナルに打ち込みます。
“`
$ rails g kaminari:config
“`
最後に、kaminariが利用するテンプレートを作成してあげます。
“`
$ rails g kaminari:views default
“`
これでひとまず準備は完了です。

## 次にControllerに記述
例としてindexで記述しています。
“`app/controllers/books_controller.rb
def index
@books = Book.page(params[:page]).per(9)
end
“`
上記のようにpage(params[:page]).per(9)を付け足してあ

元記事を表示

【備忘録】【Rails】initializeメソッドの使い方

自分用のメモです。

# initializeメソッドとは(一言で)

– コンストラクタのこと。

# コンストラクタとは
– オブジェクトを生成した際に1度だけ実行される機能を指す名称。
– なお、オブジェクトが生成された際にのみ実行されることから、そのオブジェクト内で共通に使えるインスタンス変数の初期化などに使われる。
– ただしクラスを定義した際、コンストラクタを必ず作る必要はない。
– コンストラクタが定義されていなくてもオブジェクトを生成できる。
– また、Rubyではオブジェクトを生成するnewメソッドの引数を利用して、コンストラクタによる変数の初期化も可能。

# initializeメソッドの特徴

– initializeメソッドを定義しておくと、インスタンス生成時に必ず実行したい処理をメソッドを呼び出すことなく実行することができる。
– 例えば次の例では、initializeメソッドの中でインスタンス変数の初期化を行っている。

“`ruby:
class Car
def initialize()
@name = “未定義”
end
end

c

元記事を表示

[Rails] action_argsでparamsを操る

# はじめに
[action_args](https://github.com/asakusarb/action_args)がparamsを扱う上で流行っているらしい。
さっそく使ってみる。

## 確認環境
Ruby 3.1.2
Rails 6.1.7

## 導入
“`
# Gemfileに以下を追加
gem ‘action_args’

# インストール
$ bundle install
“`

# 使い方
showアクションとcreateアクションを例にとってご紹介します。
## showアクション
### 通常のparamsの場合
“`ruby
class UsersController < ApplicationController def show @user = User.find(params[:id]) end end ``` そうです。`params[:id]`によってuserのidを取得します。 ### action_argsの場合 ```ruby class UsersController < ApplicationController

元記事を表示

【備忘録】【Rails】クラスメソッドとインスタンスメソッドの違い

クラスメソッドとインスタンスメソッドの違いについて、曖昧な理解だったため、今回改めて勉強しました。

# クラスメソッドの特徴

– クラス内で def self.メソッド名 〜 end で定義する
– クラスから直接データを呼び出すことができる
– あるモデルクラス全体に対し、情報を変更したり、参照したりするメソッドを作成するときに使うと便利
– 例えば「User」クラスを作成した場合を例にするなら、ユーザー一覧の表示や、ユーザー全体で共有して使うステータスを更新するメソッドを作成するときに使うと良い。

“`ruby:def self.method_name での書き方
class Hoge
def self.hoge
puts “hoge”
end
end
Hoge.hoge # => hoge

# selfはHogeでもOK
“`

“`ruby:class << self 内でクラスメソッドを定義する書き方 class Hoge class << self def hoge puts "hoge" end end

元記事を表示

【Ruby】論理演算子(&&、||)の短絡評価を本質から理解する

# 1. はじめに

プログラムのソースコードで、しばしば以下のように`&&`で連結された処理を目にします。
“`rb
user && user.authenticate(params[:session][:password])
“`

この処理を読み解くと、「`user`が存在する時のみ、`user`の`authenticate`メソッドを実行する」と捉えられます。
これと同様に、`&&`と`||`は次のような使われ方をすることがあります。

“`rb
条件式1 && 条件式2 #=> 条件式1がtrueの時だけ、条件式2を実行する
条件式1 || 条件式2 #=> 条件式1がfalseの時だけ、条件式2を実行する
“`

では、なぜこのような挙動をするのか、原理を説明することはできるでしょうか?
「短絡評価」という名前や、コードの実行結果だけを暗記していて、原理はよくわからない、なんてことはありませんか?

実際、[Rubyの公式ドキュメントの論理演算子の項目](https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator

元記事を表示

【備忘録】【Rails】new + save と create の違い

どちらもレコードをつくるときのメソッドですが、何が違うのだろうと疑問に思ったので調べました。

# new + save を使うべき場合

### ①コントローラー内で、条件分岐させたいとき

例えばArticleモデルでバリデーションの設定をしていて、
保存時にバリデーションを適用させたいときにはif文等で条件分岐の記述をしますが、
その場合は以下のようにnew + save メソッドを使います。
理由:createメソッドでは、たとえ保存に失敗してもオブジェクトを返すためif文がtrueとなり成功時の処理を行ってしまうからです。

“`ruby:
def create
@article = Article.new(article_params)
if @article.save
redirect_to(“該当パス”)
else
flash.now[:alert] = ‘文字を入力してください。’
render :index
end
end
“`

### ②view側で使いたいとき

例えば Book モデルを

元記事を表示

ActiveStrageとは

Activestrageとは

Webアプリを作成していると、必ずと言っていいほど必要な画像の取り扱い。
Activestrageとは単純に言ってしまえば画像を取り扱うためのものです。
ほぼ毎回使うと言っても過言ではないので、忘れないようにまとめてみました。

Activestrageを導入しよう

画像を投稿できるようにするには、ActiveStorageが必要です。
なぜなら画像はカラムとして保存することができないため、別の手段を使って保存する必要があり、
その役割を担ってくれるのがこのActiveStorageなのです。
では、まずはインストールから始めましょう。

“`
$ rails active_storage:install
“`
インストールが終わるとdb/migrate内にActiveStorageのマイグレーションファイルが追加されます。
マイグレーションファイルということは…
そう、毎回おなじみのこちらのコマンドが必要です。
“`
$ rails db:migrate
“`
ちなみにActiveStorageは3つの

元記事を表示

Bundle installでmysql2がインストールできない

### Bundle installでmysql2がインストールできない

“`
$ bundle install

(省略)

An error occurred while installing mysql2(0.5.3), and Bundle cannot continue.
Make sure that `gem intall mysql2 -v ‘0.5.3’ –source ‘https://rubygems.org/’`

In Gemfile:
mysql2
“`

ログに吐かれたエラー文を確認

“`
directory not found for option ‘-L/usr/local/opt/openssl/lib’
“`

lsでディレクトリの確認
“`
$ ls /usr/local/opt/openssl/lib
“`
ディレクトリが存在しないことがわかった。

brew install openssl で opensslのパスを確認

“`
==> openssl@3:stable 3.0.7(bottled)[keg-only]
Cr

元記事を表示

Active Recordのjoinsメソッドで複数テーブルを結合する

## これは何?

[Railsガイド](https://railsguides.jp/)の[Active Record クエリインターフェイス / 13.1.3 複数の関連付けを結合する](https://railsguides.jp/active_record_querying.html#%E8%A4%87%E6%95%B0%E3%81%AE%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B)を読んでいて、`joinsメソッド`で`配列とハッシュをどのように使えばいいか深く知りたくなった`ので、いくつかのテーブル構成で実際に試し、結果をまとめた記事です。

## 対象バージョン

– ruby: `2.7.6`
– rails: `7.0.3.1`

## joinsメソッド内のルール

①複数のテーブルを結合する場合は、配列`[]`にする
②親テーブルに対して複数のテーブルを結合する場合は、配列`[]`を省略できる
③ネストして結合する場合は、ハッシュ`{}`にする

元記事を表示

form_withで送信ボタンを押しても動かないとき(同期通信)

備忘録。
form_withで送信ボタンを作成したとき、ページの更新を行なうとテーブルに情報が残るし、けど更新しないとエラーもでないのに固まったままだった。
“`ruby

<% if user_signed_in? %>
<%= form_with model: [@item, @comment],local: true, id: "comment-form" do |f| %>
<%= f.text_area :text , class: "comment-text"%>
<%= f.submit "コメントをする", class: "comment-submit" %>
<% end %>
<% end %>

<コメント一覧>

<% @item.comments.each do |comment| %>

元記事を表示

フラッシュメッセージの日本語化

## はじめに
フラッシュメッセージの日本語化について自分自身戸惑ってしまった事があったので記録して残しておきます。

## 日本語の言語設定
config.i18n.default_locale = :jaをapplication.rb追加します。

“`ruby:config/application.rb
class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 6.1 config.i18n.default_locale = :ja end end ``` ## Gemfileの追加 Gemfileに'rails-i18n'を追加します。 ```ruby:Gemfile gem 'rails-i18n' ``` bundle installを忘れないように! ## 日本語化ファイル作成 下記の物に書いてある文章に応じて日本語化され

元記事を表示

フリマアプリにコメント機能の追加実装をする ※コメントが保存されないエラーが出続けた話。

フリマアプリ作成が一段落して、追加の実装としてコメント機能の実装に取り組みます。
itemsコントローラー
“`ruby
before_action :set_item, only: [:edit, :show,:update]
def show
@user = @item.user
@comment = Comment.new
@comments = @item.comments.includes(:user)

end
private
def set_item
@item = Item.find(params[:id])
end
“`
commentsコントローラー
“`ruby
class CommentsController < ApplicationController def create @comment = Comment.new(comment_params) if @comment.save redirect_to item_path(params[:item_id])

元記事を表示

【Rails】Railsチュートリアルのseeds.rbをリファクタリングする

# 目的
Railsチュートリアルにて、`seeds.rb`を用いて任意の数のユーザーとそれに対するマイクロポストの作成をおこないました。
先輩エンジニアに見てもらうと「リファクタリングできるよ〜」とのことだったので、その方法をまとめます。

# 何が問題なのか?
まずは`create`メソッドの使い方をおさらいします。
例として今、`number`というキーをもつ`Number`モデルから、インスタンスを5つ作成することにします。

“`ruby: レベル1
Number.create!(number: 1)
Number.create!(number: 2)
Number.create!(number: 3)
Number.create!(number: 4)
Number.create!(number: 5)
“`
毎回`Number.create!`を実行するパターンです。
この方法では`create!`メソッドを5回おこなっていることになります。
`create!`メソッドは実行するとSQL文を発行し、DBへアクセスします。
つまりこの方法では5回DBにアクセスし、それだ

元記事を表示

[rails 初心者]同率順位を踏まえたランキング機能(修正版)

初めに

前回作成したランキング機能にて、**1点だけ**動作不備が見つかりました。
今回はそのバグを解消する記事になります。
(因みに前回の記事をまだ読んでいないという方は、前提条件のところにリンクがあるので
よかったら読んでみて下さい!!)

前提条件

`前回までの記事`が一通り終了していること(因みに次の3つです)
①**レビューの基本** = 評価関係の処理についてまとめた記事です
②**レビュー機能+@(応用)** = 「評価点の`平均値化`」と「その平均値順に`並び替え`」を行いました
③**ランキング機能の追加** = `同率順位を考慮したランキング機能`を実装しました。

リンクはこちら

[[rails初心者]複数権限でのログインを使ったレビューサイトの作成(基本)](https://qiita.com/about10/items/0e376c84022f2ac238d0)
[[rails初心者]複数権限でのログインを使ったレビューサイトの作成(応用)](https://qiita

元記事を表示

本番環境で画像などを上手く反映する方法

開発環境では画像は表示されるが、本番環境では画像表示されない初歩的なミス

## 状態
開発環境では画像は表示されるのに本番環境にgit pullをすると画像などが反映されない問題

## 順序
“`rb
git pull origin main
“`
ここで勝手に本番環境で反映されるものだと思っていましたが本番環境には変更を取り込んだだけで、動作させるアプリケーションには反映されないそうです。

“`rb
bundle exec rails assets:precompile RAILS_ENV=production
“`
この一文を打ち込んであげる事で無事に反映されました。
とても初歩的なミスかもしれませんが慣れないデプロイでの作業であったので今後の教訓の為に残しておきます。

最後に補足としてCSSやJavaScriptを開発環境で追加した際にも上記に記載されているコードで本番環境に反映する事が出来るので是非試してみてください。

元記事を表示

action_cableのbroadcastが特定の端末に送信されない

# 経緯
action_cableを利用してチャットシステムを作成

開発環境で動作確認し、正常に動作

社内環境に資産適用

動作確認をしているとき、
[broadcast](https://railsguides.jp/action_cable_overview.html#%E7%94%A8%E8%AA%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88)が特定の端末に送信されないことが判明
なんで???

# 原因&解決方法
[サブスクリプションアダプタ](https://railsguides.jp/action_cable_overview.html#%E3%82%B5%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF)に「async a

元記事を表示

OTHERカテゴリの最新記事