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

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

【Rails】deviseでログイン機能を作る

# はじめに
課題で読んだ本の感想を投稿するアプリケーションを作りましたが、色々と苦戦しましたので備忘録として記事を投稿しようと思います。
今回はdeviseを使ったユーザーの新規登録・ログイン・ログアウト機能の実装について記載します。

# 環境
– 開発 (cloud9)
– 言語 (Ruby 2.6.3)
– フレームワーク(Rails 6.1.6)

# 前提
– deviseを導入している
※導入方法については[【Rails】deviceの導入](https://qiita.com/va6Gjz/items/5b3c3fc673777ebf3332)でまとめていますので、参考にしていただけたらと思います。

# モデルを作成する
ユーザー機能を作成する際はテーブルなど色々作る必要がありますが、deviceはモデルの作成すると自動的に必要なデータを作成してくれます。まずはモデルを作成しましょう。

※このコマンドはdevice独自のものになります。
“`:terminal
$ rails g devise モデル名
“`
今回は「User」という名前のモデルを作成します。

元記事を表示

【Rails】rescue_fromによる例外処理

## はじめに

rescue_fromについて軽く調査したので記録する。この記事がだれかの役に立てば幸いです。

## 結論

raiseで発生させた例外を`rescue_from`で検知し、指定したメソッドの実行に繋げることができる。

### 詳細

大まかな使い方は以下の通りになります。

“`app/controllers/application_controller.rb
# Forbiddenの例外を捕捉した場合に、rescue_403メソッドを実行する
rescue_from Forbidden, with: :rescue_403

private

def rescue403(e)
render status: :forbidden, json: { message: “アクセス権限がありません” }
end
“`

Forbiddenの例外を発生さえる流れとしては、

“`app/controllers/application_controller.rb
# 管理者のみに実行権限を与える
def allowed_to_admin_user!

元記事を表示

RailsでTerser利用時にconsole.logを消したい

アセットパイプラインで、JavaScriptの圧縮にTerserを利用するとき、次のように設定しているケースが多いかと思います。

“`ruby:config/environments/production.rb
config.assets.js_compressor = :terser
“`
通常、この設定で問題はないのですが、
**本番リリース時は、console.logも合わせて消したい!** となると、非常に残念なお知らせとなります。
この設定ですと、JavaScriptに書かれた”コメント”は消えるのですが、console.logはそのままソースコードに残ってしまうためです。

そこで、Terserにオプションを渡してあげて、挙動を調整していきます。

# console.logを消すための設定
JavaScript圧縮時、console.logを含む「console.*」系も全て消したい場合

“`ruby
config.assets.js_compressor = Terser.new(compress: { drop_console: true })
“`

元記事を表示

【Rails】deviseの導入

# はじめに
課題で読んだ本の感想を投稿するアプリケーションを作りましたが、色々と苦戦しましたので備忘録として記事を投稿しようと思います。
今回はdeviseの導入についてを記載します。

# 環境
– 開発 (cloud9)
– 言語 (Ruby 2.6.3)
– フレームワーク(Rails 6.1.6)

# deviseとは
簡単に認証機能を実装できるgemの一つです。
サインアップ機能やログイン機能が簡単に作れます。

# Gemを導入する
まず、Gemの導入します。
Gemの導入の流れは以下のようになります。
– GemfileにインストールしたいGemを記載
– Gemをインストールする

#### Gemfileにdeviseを記載する
Gemfileに、以下のようにコードを記載します。
コードの記載場所は最後の行に追加すると良いみたいです。
“`:Gemfile
gem ‘devise’
“`

#### Gemをインストールする
コードが追加できたらGemをインストールします。
インストールするためのコマンドは「bundle install」になります。
※bu

元記事を表示

Rubyバージョンが切り替わらない? rbenvがバージョンを決める順番について

## はじめに
最近、rbenvでどうしてもrubyのglobalバージョンがうまく切り替わらなくて、困っていました。
色々検索して、複数の記事を参照して設定変更したりしたけど、解決できていません..
そして、stack overflow経由して、rbenvのドキュメントにたどり着き、解決できました。
rbenvがどうやってrubyバージョンを決めるのか、についてもようやく理解できたので、メモとして記録しておきます。

## rbenvでRubyのバージョンを確定する順番
[rbenvドキュメント Choosing the Ruby Version](https://github.com/rbenv/rbenv#choosing-the-ruby-version)によると、
rbenvが利用するrubyバージョンを確定する順番は、
1. RBENV_VERSION環境変数を確認する。もし指定があれば、そのバージョンにする。RBENV_VERSION環境変数は`export RBENV_VERSION= x.x.x`コマンドラインで切り替えられる。(`set by`部分は`RBENV_

元記事を表示

Railsでエンドポイントを立てるときに沼った話

railsをエンドポイントを作成をしていて沼ったところと、どうやってそれを解決したのかを残しておきます
沼ったポイントとしては**railsのcorsの設定**です

## railsのcorsの設定
### どこで沼ったのか
オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS)において、Rails APIでは[rack-cors](https://github.com/cyu/rack-cors)というgemを使用していました。
CORSについての詳しい知識はありませんでしたが、
– 許可をしたいAPIを叩く側のドメイン
– 許可をしたいリソースファイル
– 許可をしたいHTTPヘッダー
– 許可をしたいHTTPメソッド
を設定する必要があるということは認識していました。

便利なgemに感謝しつつフロントエンドの実装を進めていたところ、ログイン用のAPIを叩いたときにsession idがcookieに保管されていないことに気がつきました。

### どうすれば良かったのか
こちらの[記事](https://nishinatoshiha

元記事を表示

belongs_to,とhas_manyを使ったDBへの参照先指定

こんにちは。
modelはDBの情報を動かすために、DBに格納されている情報を引き出してくる役割がありますが、

今回は、アソシエーションの1:Nの関係を紐づけるときに使われる
has_manyとbelongs_toについてざっくりと掘り下げてみることにしました。

開発環境

  • Cloud9
  • Rails 6.1.4

ターミナルでの作業手順

1.rails g model コマンドでマイグレーションファイルの作成
→マイグレーションファイルのテーブル内容を編集
(この時点でテーブルはまだ作成されていない)

2.rails db:migrate
→マイグレーションファイルからテーブルを作成

belongs_toとhas_many

 例として、booksテーブルとUsersテーブルに格納されているデータがあります。

“`Schema.rb
create_table “books”, force: :cascade do |t|
t.string “

元記事を表示

「完全に理解した」状態の僕が「チョットワカル…」になるまでのとある企業の新人研修 part.2

▼前半こちらから▼
https://qiita.com/kobayashimakoto/items/4fe942815c7fc941821f
今回は前回に引き続いて、どのような流れでアプリを作ったのかをご紹介します。
# はじめに
会社員の皆さん

**他部署の人の「名前」や「趣味」をいくつ言えますか?**

「みんなの趣味くらい余裕で知ってるわ」と言えるように
**お手伝い**をするアプリを作ったのでご紹介します。

## アプリ概要 〜TeaTime〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/6d6f9ffa-87bf-e825-e585-ba3d1e7955d9.png)

**TeaTime(茶会)とは**
**広く、お茶などを飲みながら話を交わすのを楽しむ集まり。**
※ 精選版 日本国語大辞典「茶会」の解説

## 簡単な使い方説明
・TeaTimeに登録するだけ。以上!
![image.png](https://qiita-image-store.s

元記事を表示

別コントローラーからビューを呼び出す

## はじめに
学習中の初心者です。
言葉足らずなところや間違えがあればコメントにて添削していただけるととても嬉しいです。

## 結論
別のファイルからビューを呼び出す際、**renderメソッド**を利用します。
renderメソッドとは、部分テンプレートを呼び出す際に利用するメソッドのことで、
部分テンプレートとは、ビューファイルで繰り返し使用するコードを切り出し、再利用する仕組みのことです。

**partialオプション**を付け、呼び出したいファイル名を指定する事で、部分テンプレートを表示することができます。
“`ruby:qiita.rb
【例】
<%= render partial: "ディレクトリ名/呼び出すファイル名" %>
“`

## 手順
呼び出されるテンプレートのファイルを作成します。
ファイル名は最初に **_(アンダースコア)** を入れること。

“`ruby:qiita.rb
【例】
_sample.html.erb
“`

該当するビューファイルにrenderで部分テンプレートを記述。
“`ruby:qiita.rb
<%= rend

元記事を表示

[Rails] undefined method `has_many’ for main:Objectと出てきた時

### はじめに
DM機能を実装中に
`undefined method ‘has_many’ for main:Object`
という見たことがなかったエラーに遭遇したので記事にしました。

### 結論
今回の場合は`has_many`のせいではなく`room.rb(Roomモデル)`の一行目の記述が何故か消えてしまった事によるものでした。
“`ruby:room.rb
class Room < #この部分が消えていた! has_many :users, through: :user_rooms has_many :chats, dependent: :destroy has_many :user_rooms, dependent: :destroy end ``` 正しくは ```ruby:room.rb class Room < ApplicationRecord has_many :users, through: :user_rooms has_many :chats, dependent: :destroy has_many :user_rooms

元記事を表示

「Rails パフォーマンスチューニング」viewファイルで起こるN + 1問題の修正方法

controller側ではなく、viewのeachでN + 1が発生していたので修正しました。

Ruby:3.1
Rails:7.0.2.3
MySQL:8.0

## 仕様
– userはcompanyをお気に入り(favorite)登録することができる
– favoriteは中間テーブル
– companyに紐づくfavoriteの中に、ログイン中のuser.idと同じものがあればCSSのclassを追加

上記の仕様を、この様に書いていた。

“`ruby:companies_controller.rb
class CompaniesController < ApplicationController def index @companies = Company.all.includes(:addresses).page params[:page] end end ``` ```erb:index.html.erb <% @companies.each do |company| %>

<% if company.favor

元記事を表示

FakerBotがActiveHashのバリデーションにかかってしまう問題の解決法

FakerBotを使ってActiveHashを含んだテストコードを作成しようとした際、問題が発生してしまったので、その問題と解決法を書いていきます。
## 問題点:FactoryBotがバリデーションにかかるidを選択してしまい、テストに失敗する
“`ruby
class Prefecture < ActiveHash::Base self.data = [ { id: 1, name: '---' }, { id: 2, name: '北海道' }, { id: 3, name: '青森県' }, ``` ```ruby class Item < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions validates :prefecture_id, numericality: { other_than: 1 } ``` 選択肢の'---'に該当するprefecture_id: 1を選択すると、バリデーションにかかるように設定してあります。 ```ru

元記事を表示

動的にフォームを追加、削除する

# 追加した分もDBに保存したい

初投稿です。

フォームを追加、削除する記事はいくつかあったのですが、
DBに保存できるようにする記事は見つけられなかったので備忘録として投稿します。

初学者なのでアラが目立つコードだと思いますが、どなたかの役に立てば幸いです。

間違えや、添削があればコメントにて教えていただければものすごく嬉しいです。

“`ruby:new.html.rb


<%= javascript_pack_tag 'addForm.js'%>

<%= f.fields_for :ingredients do |ingredient| %>

<%= ingredient.text_field :name, id:"ingredient-name_0", p

元記事を表示

動的に表示したDOMに対してjQueryでfocus()する方法

jQueryの.focus()を使ってinputタグに自動的にマウスカーソルのフォーカスを当てようとしていたのだけれど、うまくいかない。
しかしこの方法で別のDOMに対してはfocusできていたので、jQueryのバージョンだとかそういう要因ではなさそうだった。

よく考えると今回フォーカスを当てたいDOMは普段は隠れていて、ボタンを押した時だけ出てくるミニモーダルの中のinputタグだった。このボタンを手動で押してミニモーダルを開いた場合には自動的にフォーカスが当たるのだけれど、それ以外の方法(今回は onclick → trigger(“click”)による自動?クリックでミニモーダルを出現させていた)では動作していないようだ。

解決した方法:

ミニモーダルをdisplay:blockなりで出現させてから.focusするまでにsetTimeoutで100ミリ秒待つようにしたら普通に動いた。

ちなみに:

.focus()だけじゃなく.select()もこの方法で動いた。
せっかくなので.focusを.trigger(“focus”)に変えておい

元記事を表示

【Rails】ActionCableの実装〜mapメソッドについて〜

## はじめに
実装の流れは長くなるので省略させていただきます。
自分が疑問に思ってノートに記録した物を記事にしていきます。

## 前提条件
Ruby 2.6.3
Rails 6.1.5

## 外部キー制約
references型の特徴
**・外部キー制約がつかない。そのため、foreign_key: trueをつける。
・_idが省略される**

中間テーブルに使用です。

“`php:migrate
# 外部キー制約:外部にその値を主キーとして持つ他のテーブルがあること
t.references :chat_room, null: false, foreign_key: true
“`

## mapメソッド
中間テーブルのChatRoomUserから、条件を書いて配列を作ることで、
createする際の条件分岐に使用。

ログインユーザーが存在しているチャットルームデータを取得

“`php:chat_rooms_controller.rb
ChatRoomUser.where(user_id: current_user.id).map(&:chat_room)
`

元記事を表示

Railsのヘヴィな重い一覧ページを改修したお話。

# 問題
User一覧画面、表示までに**20秒**ほどかかっていた。
メモリ食い過ぎで*サーバーが落ちる*こともあった

# 結論
一覧画面に**不必要なモーダル**の切り分け
ハイパー**N+1**問題
を解決することで表示時間が1秒ほどになった。

## 詳細

一部抜粋したコード(説明に不必要な箇所は省いています)

“`ruby:customers_controller.rb
CustomersController
def index
@customers = Customer.all
end
“`

“`erb:index.html.erb
<% @customers.each do |customer| %>

<%= customer.mail %> <%= customer.foobar %> <%= customer.hoge %>
元記事を表示

Rails 診断機能を実装する タグ機能 マッチ度判断

# 実行環境

“`
ruby 3.0.2
Rails 7.0.2.3
“`

GitHubはこちら

https://github.com/kakeruAoyama/diagnose_games

### DB設計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/4284be8d-06aa-e9d6-8385-70fb2a9f9f1e.png)

GameとTagが多対多のアソシエーションで結びついている

### 診断機能の概要
gameに紐づいたタグと、ユーザーが質問に答えた回答がマッチしている数が一番多いものが表示される。
すなわち、gameに[tag1, tag2, tag3, tag4]が紐付いている場合、ユーザーの回答が、[tag1, tag2, tag3, tag5]であったならば、マッチ度は75%として表示される。
ただし、[tag1, tag2, tag3, tag5]というgameが他に存在した場合は、こちらがマッチ度100%として表示される。

#

元記事を表示

Railsでmigrationかけた後にブランチをチェックアウトしてしまった時の復旧方法

rails db:migrate掛けたことを忘れて、新ブランチにチェックアウトした後
既にテーブルが作成されていることからmigrateができなくなってしまった時の復旧方法

まず、migrateしてしまった時のブランチにチェックアウトします。

そして以下のコマンド
“`zsh
rails db:migrate:status
“`

そうするとこうなっているはず。
“`zsh
Status Migration ID Migration Name
————————————————–
up 20220606000001 Create hoge
up 20220606000002 ********** NO FILE **********
down 20220606000003 Create fuga
“`
********** NO FILE **********
これはmigrate した後にコミットしなかったことで、存在しないファイルがmigrateされて

元記事を表示

【Rails】DBから最新データが取得されていない時の対処法

# 初めに

ポートフォリオのライク機能を作成した際に、`DB`のデータは変更されているのにインスタンスのデータは更新されていなかった。

## 環境

– Rails 6.1.4
– Ruby 2.7.4

## 結論

`SQLキャッシュ`がされていたので、同じ`SQL`を発行した場合キャッシュされたデータ(更新前のデータ)が返ってきた。

# 解決方法

`SQLキャッシュ`は

– 同じクエリが発生すると、データベースへのクエリを実行せずに、キャッシュされた結果を返す
– `SQLキャッシュ`は、アクションの開始時に作成され、アクションの終了時に破棄されるので、アクションの実行中しか保持されない。

なので、`reload`メソッドを利用することでキャッシュを使わずに再取得できます。

“`ruby:like_controller.rb
class LikesController < ApplicationController def create review = Review.find(params[:review_id]) like = Like.

元記事を表示

begin rescue 文

## find
与えられたどのオプションにもマッチする“`「主キー」に対応するオブジェクト“`を取り出せます。
“`
irb> customer = Customer.find(10)
“`
カラム名をつけなくていい。

## find_by
与えられた条件にマッチするレコードのうち“`最初のレコードだけ“`を返します。
“`
irb> Customer.find_by first_name: ‘Lifo’
=> #

irb> Customer.find_by first_name: ‘Jon’
=> nil
“`
カラム名をつける

“`rb
irb(main):001:0> user = User.all
TRANSACTION (0.1ms) BEGIN
User Load (0.4ms) SELECT `users`.* FROM `users`
=>
[# post = Post.

元記事を表示

OTHERカテゴリの最新記事