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

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

GoogleDriveが表示されない。

# はじめに
本記事はプログラミング初心者が、railsの学習を進めながら、躓いた部分、解決した箇所、またそれらの解決方法を備忘録も兼ねてまとめているものです。
最初はprogate。そのあと、「現場で使える RubyonRails5 速習実践ガイド」(通称)「現場Rails」を参考に進めていきました。
そのため、記事の内容には誤りがある可能性があることをご理解ください。
誤りがあればお手数ですが、ご指摘いただければと思います。よろしくお願いします。

# 環境
Ruby 3.1.2
Rails 7.0.3.1

“`new.slim
.d-flex.flex-column.bd-highlight.mb-3
iframe src=”https://drive.google.com/file/d/1VuZoeLxVGNaEAs41OFyc5tCWpTU8Wbq4/view?usp=sharing” width=”100%” height=”100%”
.d-flex.justify-content-center
= f.check_box :agree

元記事を表示

【Rails】ストロングパラメータについて勉強しました【form_with】

# 目的
[Railsチュートリアル 第7章](https://railstutorial.jp/chapters/sign_up?version=6.0#sec-strong_parameters)にて**ストロングパラメータ**という概念が紹介されていたので、その必要性と実装方法をまとめます。

# 今回開発するもの
**Userモデル** ユーザー
has_many: posts
`id`カラム: userインスタンスが作成されると自動付与される値

**Postモデル** ユーザーが行う投稿
belongs_to: user
`content`カラム: 投稿内容
`user_id`カラム: 投稿とユーザーを紐づける値

**表示画面**
`content`にテキストを入力し、送信すると新規postに`content`と`user_id`が入力される。
という機能を実装します。

これを実装するための`create`アクションをストロングパラメータを使わずに(Progate的に)書くと下記の様になります。
“`ruby:posts_controller
def create

元記事を表示

【Rails】CanCanCanでリソースが特定の条件を満たすときのみ権限を付与する方法

Railsにおいて権限設定を簡単に実装できる方法は、Cancancanを使うことが1つの手段として考えられます。
https://github.com/CanCanCommunity/cancancan
cancancanを使った権限設定では、**特定の条件を満たすリソースについては特定のアクションを許可したい**、という場合があります。
そんな時に取れる対応方法を紹介します。

# 想定ケース

**ユーザーは、企業名(name)にhogeの文字列を含む企業についてはメールを送れる。**

こんな権限設定がしたいとします。
準備として、companyモデルで「名前にhogeが入っている」ことを判定するインスタンスメソッドを定義します。

“`ruby:company.rb
class Company < ApplicationRecord ...(略) def include_hoge? name.include?('hoge') end end ``` # Abilityの書き方 この場合、ブロックを使って以下のように書くと、上記を満たす権限設定を書くことが

元記事を表示

Railsチュートリアル10.2.3 演習1(フレンドリーフォワーディング)で詰まった件

Railsチュートリアル10.2.3 演習1(フレンドリーフォワーディング)で詰まったので、備忘録として残します。コードは基本チュートリアルのコピペ通りで、環境もすべてチュートリアルに従っています。

## 演習内容
> フレンドリーフォワーディングで、渡されたURLに初回のみ転送されていることを、テストを書いて確認してみましょう。次回以降のログインのときには、転送先のURLはデフォルト(プロフィール画面)に戻っている必要があります。ヒント: リスト 10.29のsession[:forwarding_url]が正しい値かどうか確認するテストを追加してみましょう。

## 最初に書いたテスト
“`ruby:users_edit_test.rb
test “successful edit with friendly forwarding” do
#追記前
# get edit_user_path(@user)
# log_in_as(@user)

#追記後
assert_equal session[:forwarding_url],

元記事を表示

【Rails】ActionMailerで作成したメールを簡単にプレビューで見る方法

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## プレビューで見る方法

“`ruby
class UserRegisterMailer < ApplicationMailer default from: 'info@example.com' def registered_email(user) @name = user.name @email = user.email mail to: @email, subject: 'ご登録ありがとうございます' end end ``` ```UserRegisterMailer```なら```UserRegisterMailerPreview```という名前で```Preview```を作成。 ```Preview```では```registered_email```メソッドに引数を渡せないので注意。 ```ruby class UserRegisterMailerPreview < ActionMailer::Preview def regist

元記事を表示

【Rails】マイグレーション時に既存データも一緒に更新する方法

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## 前提

“`Category“`モデルに“`code“`というカラムがあったが“`name“`を追加したい
その際、下記の既存データの“`code“`の値を“`name“`カラムに更新したい

“`ruby
Category.seed(:id,
{ id: 1, code: Category.code.ruby.value },
{ id: 2, code: Category.code.rails.value },
{ id: 3, code: Category.code.php.value },
{ id: 4, code: Category.code.laravel.value },
{ id: 5, code: Category.code.js.value },
{ id: 6, code: Category.code.java.value },
{ id: 7, code: Category.code.kotlin.value }

元記事を表示

【Rails】生SQLを書きそうになったらsanitize_sql_for_orderを検討しよう

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

##
UserモデルにPost作成日でnilが最後に来るようにソートするスコープがあったとき、
“`created_at_sort“`に入ってきた値が“`desc“`か“`asc“`で降順か昇順にソートしている。
“`order“`の中で生のSQLを書くことになってしまいセキュリティとしてあまり良くない。
あと美しくない。
“`models/user.rb
scope :sort_by_created_at, ->(created_at_sort) do
if created_at_sort == ‘desc’
eager_load(:posts)
.order(‘posts.created_at DESC NULLS LAST’)
.select(‘users.*’, ‘posts.created_at AS posts_created_at’)
else
eager_loa

元記事を表示

binding.pry

# binding.pry
Gemのpry-railsを追加することで使える機能。
binding.pryを記入した処理を、ローカルサーバーで実行すると記入された場所で処理が中断される。

# エラー → 仮説 → デバッグ
今回の場合は、
エラー  : NoMethodError in Tweets#index
仮説   : formでパラメーターが送れていない可能性がある
デバッグ : binding.pryでparamsをチェック
という流れでデバッグする。

“`diff_ruby:例
# ツイート投稿ボタンが押され、createされる処理
def create
+ binding.pry
Tweet.create(tweet_params)
end
“`

#### ターミナルを確認
処理が止まり、irbのように対話可能の状態になる

“`ruby:例
Started POST “/tweets” for ::1 at 2020-03-18 17:31:23 +0900
Processing by TweetsController#create

元記事を表示

RuboCopでC: [Correctable] Rails/RakeEnvironment: Include :environmentと指示された

## RuboCopで指摘されたこと
`bundle exec rubocop`を実行すると、以下のエラーが生じました。
“`ruby:エラー内容
lib/tasks/auto_annotate_models.rake:6:3: C: [Correctable] Rails/RakeEnvironment:
Include :environment task as a dependency for all Rake tasks.
task :set_annotation_options do
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
“`

結論を言うと`auto_annotate_models.rake`の記載を以下のように修正することで解決できます。
“`ruby:修正内容
– task :set_annotation_options do
+ task :set_annotation_options => environment do
“`

## エラー解消のために行ったこと
エラーメッセージの内容が`task :set_annotation_

元記事を表示

検索フォーム

# ルーティング設定

collection… ルーティングにidがつかない
member… ルーティングにidがつく

memberで指定した場合URLの指定先にidがつくため、詳細ページのようなidが必要な場合に有効。
idが不要な場合は、collectionでルーティングを指定する。

memberの場合
“`ruby:例.html.erb
Rails.application.routes.draw do
resources :tweets do
member do
get ‘search’
end
end
end
“`

Prefix Verb URI Pattern
search_tweet GET /tweets/:id/search(.:format) tweets#search

# form_withで検索フォーム作成

“`ruby:例.html.erb

<%= for

元記事を表示

Web APIのエンドポイントやレスポンスにIDを使用してはいけないか考える

# はじめに
皆様、こんにちは!
佐久間まゆちゃんのプロデューサーの[@hiroki_tanaka](https://note.com/hiroki_tanaka)です。

私は現在、RailsシステムのAPIリプレイス活動に携わっています。
その際にエンドポイントにIDを使用するかどうかやレスポンスにIDフィールドを含めるか含めないかといったID問題があったので、考えたこと・調べたことをまとめたいと思います。

# 結論
**エンドポイントやレスポンスにIDを使用しないほうが良い。**

# 理由
Railsにおいて、IDカラムは基本的にDBでAuto Incrementされて発行された連番のサロゲートキーに当たります。
そのため、サロゲートキーであるIDカラムが露出してしまうことで以下のような問題が発生します。

### IDの値の大小によって、サービス規模が推測出来てしまう。
例えば、`Get /api/users/:id`といったIDに紐づくユーザ情報を取得するAPIが存在した場合、ユーザは`:id`に好きな値を入れることができます。
そのため`Get /api/users/1

元記事を表示

【Ruby】電話番号をハイフンなしの半角数字に成形する方法

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## ハイフンなしの半角数字に成形する方法

“`ruby
phone_number = ‘090ー1234ー5678’
phone_number.tr(‘0-9’, ‘0-9’).gsub(/[^0-9]+/, ”)

# => “09012345678”
“`

“`tr“`で全角数字だったら半角数字に成形。
“`gsub“`でハイフンなどの“`integer“`以外の文字列が入っていたとき削除(空文字に変換)。

## 成形するメソッド

下記記事の内容を組み合わせて、電話番号をきれいに成形するメソッドにしてもいいかも。

“`ruby
def format!(phone_number)
return nil if phone_number.blank?
return phone_number if phone_number.match?(/\A[0-9]+\z/)

phone_number.tr(‘0-9’, ‘0-9’).gsub(/[^0-9]+/

元記事を表示

【Rails】ActiveStorageで、保存する前に画像を縮小する方法

大阪でRailsを中心に学習しているヨマ(@yoma_2003)です!
「ActiveStorageで、保存する前に画像を縮小する方法」をまとめます。

※おことわり※
断定口調でまとめますが、初学者であるため間違い等あればご指摘頂けると嬉しいです。

# はじめに

### やりたいこと
**ActieStorageでAmazon S3等に画像を保存する場合に、指定のサイズ以下に画像を縮小してから保存したい。**

### 必要環境
画像処理のためのツール、Gemの導入。

– ImageMagick:画像加工ツール(本番環境ではサーバーにもインストールする)
– Minimagick:ImageMagickをRubyから使えるようにするGem
– ImageProcessing:画像サイズを調整するGem

https://qiita.com/TerToEer_sho/items/7f8f42503e3100c652d5

# 結論
コントローラーに渡されたパラメーター内の画像ファイル(`ActionDispatch::Http::UploadedFile`の`tempfile`)

元記事を表示

Next.js(TypeScript), Rails, Docker, Vercel, AWS ECS(Fargate), Github Actions, Terraformを使用してポートフォリオを作成しました。

# はじめに
ポートフォリオとして作成したWebアプリケーションの紹介記事です。

# 開発アプリ概要

#### アプリ名: 近所の人たちと家で余っている食べ物をシェアするアプリ「Mottainai-zerowaste」
家庭内で発生するフードロスを解決するために作成したWebアプリです。

### 使用技術
– Backend
– Rails 6.1.4.4(API mode)
– Ruby 2.7.2
– Nginx
– Puma
– PostgreSQL 13.4
– RSpec
– Rubocop
– Frontend
– Next.js 12.1.0
– React 17.0.2
– Typescript 4.5.5
– Tailwind CSS 3.0.23
– Jest 28.1.0
– React Testing Library 12.1.5
– ESLint / Prettier

元記事を表示

【入門】Rails APIのテスト手法まとめ

## はじめに

自分は2021年に新卒でWeb系の開発会社にフロントエンジニアとして入社し2022年で2年目になります。

実務ではReact×TypeScriptを利用したフロント周りの開発やRailsを用いたAPIの開発を行なっています。

今回は実務でRailsプロジェクトにテストを導入することになり「RSpec」について改めて学び直したのでその内容を紹介します。

はじめにRSpecの概要を説明し、その上でRails APIのCRUDの具体的なテストコードを書いていきます。

## この記事の対象者

– Railsのテストを学びたい人
– Rails APIでのテストの書き方を知りたい人
– RSpecに入門したい人

## この記事でやらないこと

– 環境構築
– RSpecに関しての詳しい解説

なお本記事は、下記の記事の続きとなっています。

https://qiita.com/KNR109/items/d7adfd7cc068c2456670

そのためDocker上でRailsのAPIモードの環境構築をしていない人は準備した上こちらの記事に進んでいただければと思

元記事を表示

【Rails】.env に定義した環境変数が反映されないときの解決方法

## はじめに
今回は、`dotenv-rails`を使って環境変数を管理していて、
`.env `に環境変数を定義して、コンソールで試したけど反映されないときに試すことを書きました。

`dotenv-rails`の設定などは以下の記事が参考になるかと思います!

https://pikawaka.com/rails/dotenv-rails

## 結論
・`spring`を再起動する
・`docker-compose`を使用している場合は、`docker-compose.yml` ファイルにも定義しているか確認する

## `spring`を再起動する
[Railsで環境変数の変更が反映されないときはspring stopを試す](https://qiita.com/metafalse/items/7294afa3d1be3315e999)
↑の記事を参考にさせていただき、試してみてください。

## `docker-compose.yml` ファイルにも定義しているか確認する
`docker-compose`を使用している場合は、
`docker-compose.yml` フ

元記事を表示

【Rails】params[:id]の:idって何?

## 今更ながらparams[:id]の:idって何?
show,edit,updateアクションが呼ばれるといきなり下記のような表現が出てきます。
“`
def show
@user = User.find(params[:id])
end
“`

この:idが何なのか、Railsチュートリアルでは以下のようにありました。
※Railsチュートリアル7章より引用
> このid: ‘1’は /users/:id から取得した値です。この値を使って
> User.find(params[:id])
> 上のコードでid=1のユーザーを検索できる、といった仕組みになっているのです

そして/user/:idの:idの部分は自動的にDBに生成されるカラムで、
以下のようにgenerateコマンドを実行した際に自動で作られる一意の値(主キー)です。
詳細はRailsチュートリアル2章を参照してください。
“`
$ rails generate scaffold User name:string email:string
“`

以上、復習までに

元記事を表示

アソシエーションした項目をselectプルダウンで並び替え

まずはモデルで関連付けを行います。
`dependent: :destroy`はbuildingが削除されたらroomも削除するといったメソッドです。
scopeメソッドを使うとコントローラで呼び出すだけで並び替えができるようになります。

“`model/building.rb
class Building < ApplicationRecord has_many :rooms, dependent: :destroy scope :latest, -> {order(created_at: :desc)}
scope :old, -> {order(created_at: :asc)}
scope :short, -> {order(station_minute: :asc)}
scope :long, -> {order(station_minute: :desc)}
“`

“`model/room.rb
class Room < ApplicationRecord belongs_to :building ``` viewでパラメーターを`pa

元記事を表示

dockerでActiveStorageを用いてS3に画像をアップロードする方法

こんにちは。今回はs3に画像をアップロードし、画像を表示させるのにかなり苦労しましたので次回からは沼らないように自分が成功した方法を備忘録として残しておきます。ここではdockerの構築方法は割愛します。

# やりたいこと
ActiveStorageを用いてS3に画像をアップロードし、画像を表示したい。

# 前提
dockerを用いてアプリを開くことができる。

# 参考にしたサイト

https://zenn.dev/kurao/articles/ce8e583450c76e

https://qiita.com/tsubasan1122/items/0171fe04754a760f7e4a

基本的にはこちらのサイトを参考にして作成した。

# つまづいたところ

## dockerfile

credentials.yml.encを編集するためにvimで編集する必要があるのですが、自分のdockerでは初期状態ではvimを開くことが出来なかったので

“`dockerfile
RUN apt-get update
RUN apt-get install vim
“`

元記事を表示

scopeとmoduleの使い分け

# はじめに
使い分けが曖昧になることが多かったので記事にまとめてみました!

scope

* URLは指定のパスにしたい、かつファイル構成は変更したくないときに使用する
* URIパターンのみをカスタマイズしたいときに使用する

| Prefix Verb | URI Pattern | Controller |
| ———– | ——————- | ————– |
| articles | /admin/articles | articles#index |
| new_article | /admin/articles/new | articles#new |

**URI Patternのみadminが付加されており、app/controllersディレクトリ配下のコントローラである**

module

* module(scope module)はURLのパスは変更したくない、かつファイル構成は指定したい時に使用
* Controller#Actionのみ

元記事を表示

OTHERカテゴリの最新記事