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

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

【Rails】render :json に modelメソッドの返り値を追加する方法

# きっかけ
`controller`の返り値を`json`形式で返却する時、モデルで定義されている`attributes`しか返すことができません。そんな時、他の`attributes`を追加する方法が分からず困ることがあったので、備忘録として残します。

# attributeを追加する
`render json:` に、`methodsオプション`をつけ、`model`で定義したメソッドを呼び出す。

# 使い方
例えば・・・
以下のようなモデルがあったとする。
“`ruby
create_table “users”, force: :cascade do |t|
t.string “first_name”, null: false
t.string “last_name”, null: false
t.datetime “created_at”, precision: 6, null: false
t.datetime “updated_at”, precision: 6, null: false
end
“`

で、以下のようにで`ActiveRecor

元記事を表示

システムスペックではvisit hoge_urlではなくvisit hoge_pathと書かないとNet::ReadTimeoutエラーが発生する

## 発生した問題
Hello worldレベルのごく簡単なRailsアプリを作成し、rspec-railsをインストールして次のようなシステムスペックを書きました。

“`ruby
require ‘rails_helper’

RSpec.describe “Home”, type: :system do
before do
driven_by(:selenium_chrome_headless)
end

example do
visit root_url
expect(page).to have_content ‘Home#index’
end
end
“`

テストを実行すると・・・あれ?

“`
$ bundle exec rspec
DEBUGGER: Attaching after process 28722 fork to child process 28745

(何も起きない)
“`

この状態が何十秒も続き、最終的には以下のエラーが出て終了しました。

“`
$ bundle exec rspec
DEBU

元記事を表示

【Rails】Rails6系にアップデートしたらテストでbut rendering with <["rescues/blocked_host", "rescues/layout"]>というエラーが出た【minitest】

# どうした?
ある程度開発を進めたタイミングでRailsのバージョンを5系から6系へアップしたところ、テストでエラーが出ました。

# 環境
“`terminal
$ ruby -v
=> ruby 3.1.2p20

$ rails -v
=> Rails 6.1.7
(アップデート前: 5.2.8.1)
“`

# 事象
minitestにて
“`
get “/”
assert_template “home/top”
“`
の結果
“`terminal
expecting <"home/top"> but rendering with <["rescues/blocked_host", "rescues/layout"]>
“`
と返ってきました。
もちろんバージョンアップ前はするすると通っていたテストですし、ローカルサーバー上でも問題ありません。

# 解決策

[参照元]((https://qiita.com/Mackey3510/items/7bfaa0b42782de40bc30))の解決策①を試しましたが、テストでのエラーは解決しませんでした。
そこで、`c

元記事を表示

rails で slack command の request を受け取る

# 概要
– slack command など request end point を slack へ設定する
– slack command request から data を取得
– slack command が投入された channel へ応答を返す
– 別記事にて記述

# request end point の設定
– slack app 設定画面を開く
– https://api.slack.com/apps/
– [ slash command ] を開く
– [ Create New Command ] を選択し, 以下を埋める
“`
– Command : command 名を設定
– Request URL : rails の url path を設定 # http://rails.path/ など
– Short Description : command の簡易説明を設定
– Usage Hint : command の使用方法などを設定

元記事を表示

【Ruby on Rails】Railsチュートリアルを参考にログイン機能実装の流れをおさらい

# ユーザの作成

Userモデルにパッと必要そうなカラムを
まず入れてみる。
“`:terminal
rails g model User name:string email:string
“`

一旦migrationする。
“`:terminal
rails db:migrate
“`

ログイン機能とかがないのであれば、
もしかしたら、これでも足りる(?)のかもしれないが、
ログインするためには、
passwordが必要であろう。

セキュリテイーとかをガン無視するのであれば、
単にpasswordカラムをUserモデルに追加して、
そのまま平文で保存すればいいと思うが、
流石にそれはまずいということで、
has_secure_passwordを使うことにする。

そのためには、password_digestカラムが必要になるので、
password_digestをUserモデルに追加する。
“`:terminal
rails generate migration add_password_digest_to_users password_digest:string

元記事を表示

【爆速版】Rails環境構築から自動デプロイまで(M1Mac)

# 1. Dockerのインストール
https://qiita.com/rexid/items/dd3db91b612f0c70097c

# 2. Rails開発環境構築
https://qiita.com/rexid/items/4ea724cef462560039da

# 3. Herokuでデプロイ
https://qiita.com/rexid/items/9ba6b1bb338a3e2b5d8b

# 4. テスト&デプロイ自動化
https://qiita.com/rexid/items/0265e16f11cba57a07cc

元記事を表示

【CI/CD】RailsアプリケーションにCI/CDを構築

# 0. 前提
– Dockerで構築したRailsアプリケーションをHerokuでデプロイしていること

https://qiita.com/rexid/items/9ba6b1bb338a3e2b5d8b

手動デプロイを毎回行うのが面倒なので、**CI/CDを導入しデプロイを自動化する**

## CIとは
– 継続的インテグレーション(Continuous Integration)
– ソースコードを変更してGitHubにアップする度にビルドやテストを自動実行し、コードの品質を一定に保つ方法

## CDとは
– 継続的デリバリー(Continuous Delivery)
– テストを通った変更→レビューOK→マージされたらデプロイを自動的に行う仕組み

## CircleCIとは
– CI/CDを構築するためのサービス
– ビルド・テスト・デプロイをCloud上で行ってくれる

# 1. コードをGitHubにアップする
– Git
– コードはGitでバージョンを管理
– 元に戻せる
– 変更履歴が分かる

元記事を表示

Deviseで、メールテンプレートの編集ができないときの対処法(template_pathではなく、headers_forを使う)

# Rails & deviseにてメールのテンプレートを変更

カスタムメーラー `app/mailers/user_mailer.rb`を、
“`
class UserMailer < Devise::Mailer default template_path: 'users/mailer' end ``` と定義したが、以下のデフォルトのメールが変更できずでした。![スクリーンショット 2022-09-23 18.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730386/90478abf-c56e-e1ff-f6c6-ddf2d34ae8af.png) ## 対応方法 以下のように、headers_forメソッドをオーバーライドすることで、設定したテンプレートが使用できるようです! ``` class UserMailer < Devise::Mailer # 以下の記述では動作しない # default template_path: 'users/mailer'

元記事を表示

【デプロイ】Dockerで開発環境構築したRailsアプリをHerokuで本番公開する(M1Mac)

# 1. 事前準備
前提:DockerでRailsの環境構築を行っておく(目安:15分)

https://qiita.com/rexid/items/4ea724cef462560039da


**Gitの初期設定を行う**
※下記コマンドすべて実行
“`terminal
$ cd Documents/rails_docker
$ git config –global user.name “GitHubに登録したユーザネーム”
$ git config –global user.email “GitHubに登録したメールアドレス”
$ git config –global merge.ff false
$ git config –global pull.rebase merges
“`
– `git config –global merge.ff false`・・・mergeの際にファストフォワードが起こらないようにする設定
– `git config –global pull.rebase merges`・・・pullの時に常にrebaseする設定

元記事を表示

【Rails】コントローラの異なるページ上で投稿/削除するしくみをつくる

# 目標物の確認
今回の目標物は以下のようです。
![Qiita用.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/b50ddb43-49ac-d72b-7ce6-63204a15a128.jpeg)
ユーザーAのポストに対し、ユーザーBがコメントを投稿します。
コメントの投稿フォームはposts/show内にあります。
コメントはposts/show内で表示され、自分のコメントに対しては削除することが可能です。

# 分からなかったこと
ポスト表示ページのパスが`posts/:id`であり、ページが持つ固有の`params`要素は`id`のみであるならば、、、

+ コメントを作成する際はCommentモデルの`post_id`カラムに`params[:id]`を代入すれば良いのは分かる。
+ コメントを削除する時、該当するコメントの`id`を`find_by`を使って探すことができない。
(`params`が持つ`id`はPostモデルの`id`であり、Commentモデルの`id`で

元記事を表示

【M1Mac】DockerでRails開発環境構築

# Rails開発環境構築手順
**前提:Dockerがインストールされていること**
[【初心者】Dockerのインストールと仕組みについて](https://qiita.com/rexid/items/dd3db91b612f0c70097c)
### 1. 空のアプリケーションディレクトリを作成
– 今回はDocumentsディレクトリ配下に`rails_docker`ディレクトリを作成
 ※ディレクトリ名は任意
“`terminal
$ mkdir ~/Documents/rails_docker
$ cd ~/Documents/rails_docker
“`

### 2. 作成したディレクトリ配下に空の`src`ディレクトリを用意し、更にその配下に`Gemfile`を用意し編集する
“`terminal
$ mkdir src
$ cd ~/Documents/rails_docker/src
$ touch Gemfile
“`
– railsのgemを使って「rails new」コマンドを打つとrailsのファイルの雛形を作ってくれる
※エディタは*Visu

元記事を表示

【Rails】database.ymlにMySQLのパスワードを設定する方法

# はじめに
今回は、Mysqlのパスワードを変更したことにより、発生したエラーの解消方法についてまとめました。

※おことわり※
基本的に学習内容のアウトプットです。
初学者であるため、間違い等あればご指摘いただけますと嬉しいです。

# この記事の目的
以下内容のアウトプット
– Mysqlのエラーとその解消方法
– database.ymlにMySQLのパスワードを設定する方法

# 開発環境
– Ruby 2.6.5
– Ruby on Rails 6.0.0
– MySQL 14.14

# この記事の内容
1. Mysqlのエラー
2. Mysqlのパスワードを確認
3. database.ymlにMySQLのパスワードを設定

# 1. Mysqlのエラーの概要
Mysqlのパスワードを設定(変更)したことにより、ローカルでサーバを立ち上げた際にエラーが発生しました。

※エラー解消のプロセスでNOとYESのエラーに遭遇しましたが、最終的にエラー解消できました。
“`
Mysql2::Error::ConnectionError: Access denied for u

元記事を表示

RuboCop Rails (rubocop-rails) のリリース内容で Rails の情報をキャッチアップする

# この記事は?

Ruby の静的コード解析の定番 Gem の [RuboCop](https://github.com/rubocop/rubocop)。そのひとつひとつのルールのことを Cop と呼びます。そして、[RuboCop Rails](https://github.com/rubocop/rubocop-rails) は Rails 向けのルールを RuboCop に追加するための Gem です。

ふと、RuboCop Rails で追加された Cop (ルール) を確認することで、Rails の知らない機能を知るいい機会になるのではと思いました。そこで、試しに 2022/09/09 (金) にリリースされたバージョン 2.16.0 の内容を見てみました :eyes:

https://github.com/rubocop/rubocop-rails/releases/tag/v2.16.0

そうすると、案の定知らないことばかりで非常に勉強になりました!そこで、実際にどんな学びがあったかこの記事で共有したいと思います ?

# 例: RuboCop Rails 2

元記事を表示

【初個人開発】K P T管理アプリ「Animal KPT」を作りました。

# はじめに
こんにちは [@Taiga_aniK](https://twitter.com/home)と申します。

みなさんKPTはされたことはありますか。
KPT(ケプト) :Keep(できた/継続すること) Problem(改善するべき問題点) Try(挑戦したいこと)の3要素を掘り下げ、学習や仕事を改善できるアクションを導き出すツールです。

Animal KPT では、達成度を色で別け、「振り返り」をより確実にします。ツイッターと一緒に使えます。

【Twitter】

【今回作ったアプリ】
https://obscure-chamber-30165.herokuapp.com/tops/index
【GitHub】
https://github.com/tai9174/animal_kpt

# 使用環境

• Ruby 3.0.1
• Rails 6.0.3

# アプリの主な機能
### トップ画面
トップ画面のホワイトタイガーは丹精を込めて描きました。
Animal KPTという名前は、デザインに動物を

元記事を表示

Rails nil?とempty?とblank?メソッドの違い?・・・わかってます・・・

# はじめに
実務でコードを書いているときに次の3つの違いを先輩に問われたことがありました。
– nil?
– empty?
– blank?

どれもレシーバに値ががない状態?であることを確認するときに使っていました。
私自身よく考えずに使っていたので詳しく調べてみることにしましたので備忘録として残します。
間違いや補足がありましたら教えてください。

# 環境
Ruby 2.7.1
Rails 6.0.5

# 3つの違いとは
### nil?
Rubyのドキュメントによると次の通りです。
>レシーバが nil であれば真を返します。

~~レシーバ自体が存在しない場合~~、つまりnilであればtrueを返します。

※追記
>nil は何かが存在しないことを表すために用いられるオブジェクトです。

レシーバが存在しないということはあり得ないというご指摘をいただきましたので追記です。

https://qiita.com/scivola/items/da2480ca4597a7dcf73d

### empty?
Rubyのドキュメントによると次の通りです。
>文字列が空 (

元記事を表示

Node Sass does not yet support your current environment: Linux Unsupported architecture (arm64)

dockerで起動したrailsアプリでエラー出ていたので備忘録

## エラー内容

“`
Uncaught Error: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
Error: Node Sass does not yet support your current environment: Linux Unsupported architecture (arm64) with Node.js 12.x
For more information on which environments are supported please see:
https://github.com/sass/node-sass/releases/tag/v4.14.1
at module.exports (:3000/app/node_modules/node-sass/lib/binding.js:13:13)
at Object. (:3000/app/node_mo

元記事を表示

【Rails】【Ruby】find_by_sql でも preload したいとき

# はじめに
`find_by_sql` を使って複雑なSQL文を書いたが、N+1を避けるために `preload`したい時がある。

# 結論
下記のように書けばOK
“`ruby
records = User.find_by_sql(…)
ActiveRecord::Associations::Preloader.new.preload(records, :like)
“`

下記は`preload`が無視されるのでダメ
“`ruby
User.preload(:like).find_by_sql(…)
“`

# 注意点
**Rails7 で記法が下記のように変わる**
“`ruby
records = User.find_by_sql(…)
ActiveRecord::Associations::Preloader.new(records: records, associations: :like).call
“`

# 参考
https://www.natsuneko.blog/entry/2017/04/18/find_by_sql-preload

元記事を表示

[Rails] 複数の小モデルを跨いだor検索

バージョンの問題で5.1.以下の複数の小モデルを使ったor検索の実装方法があまり載っていなく少しでも役に立つかもと思ったので投稿します。
もっと良い書き方があれば教えていただきたいです。

## 学んだこと
・includeを使うと小モデルのオブジェクトを親クラス内から使えるということを学びました。
“`
Child.include(:parent).is_summer_vacation
“`
・idを使ってor検索を実装すること(rails5.2からは.[or()](https://qiita.com/YumaInaura/items/c4ea8271f5793962a26d)を使っていけるかも)
## 環境
Rails 5.1.6.2
Ruby 2.5.0

### DB
“`book.rb
has_one: business #ビジネス書
has_one: novel #小説
has_one: comic #漫画
“`

### 複数の小モデルを跨いだor検索
本の検索サービスにおいてアメトークで紹介された本を絞り出すという状況を想定して実装コードを紹介します。
“`

元記事を表示

Rails 7 + ImportmapでFont Awesomeを実装する

# FontAwesome
アイコンを使うのに[FontAwesome](https://fontawesome.com/)というライブラリーはすごくいいだけど、インストールするには公式サイトにこれしか書いてなかったからインストールに詰まりました。
“`shell
# npm
npm install –save @fortawesome/fontawesome-free

# yarn
yarn add @fortawesome/fontawesome-free
“`

これだけだとアイコンは表示されないし、フレームワークごとのインストール方法は書いてなかったからちょっと調べてみたら、YouTubeの[この動画](https://www.youtube.com/watch?v=c-EbQDB0RsQ)を見つけてFontAwesomeをけっこう簡単に実装できたのでやり方をこちらにも書いときます。

そもそもImportmapの使い方は知らなかったのが詰まる原因だったと思うんで反省していますが、とにかく実装できたのですっきりしました。

# パッケージマネジャーでインストールした後に

元記事を表示

【Rails】countメソッドにカラムを指定してエラーを回避

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## 状況

relationでjoinしている“`posts“`に“`count“`したら下記のエラーが発生し“`count“`できない。
“`ruby
posts = Post.joins(:users)
=>Post::ActiveRecord_Relation

posts.count
=>ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near “AS”
“`

## 解決法

ActiveRecordのcountメソッドは引数にカラムを指定できるのでそれを使うとcountできる。

“`ruby
posts = Post.joins(:users)
posts.count(:posts)
=> 4
“`

## 参考

https://railsdoc.com/page/count

元記事を表示

OTHERカテゴリの最新記事