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

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

【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を作る時にrailsのgemを使って「rails new」コマンドを打つとrailsのファイルの雛形を作ってくれる

元記事を表示

【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

元記事を表示

パーシャルとは?

# パーシャルとは?
“`レンダリング処理を扱いやすい単位に分割“`するしくみです。

## パーシャルの表記方法
パーシャルを“`ビューの一部としてレンダリング“`するには、ビュー内で以下のようにrender メソッドを使います。
“`html
<%= render "menu" %>
“`
## パーシャルのファイルの名前の注意点
レンダリングされるビュー内に置かれている上のコードは、その場所で_menu.html.erbという名前のファイルをレンダリングします。“`パーシャルファイル名の冒頭にはアンダースコアが付いている“`ことにご注意ください。

### _(アンダースコア)をつけない場合もある
アンダースコアは通常のビューと区別するために付けられていますが、アンダースコアなしで参照されることもあります。“`これは他のフォルダの下にあるパーシャルを取り込む場合“`も同様です。

“`html
<%= render "shared/menu" %>
“`
上のコードは、app/views/shared/_menu.html.erbパーシャルをその位置に取り

元記事を表示

flashに任意のキーをセットして表示するには

## 環境
Rails 5.2
Ubuntu20.4

## はじめに
flashにはオプションとして、**notice**と**alert**の2つのキーが用意されていますが、任意でnoticeとalert以外のキーを設定して、取り出して表示することもできるようになっています。

## 普通のやり方
標準的な使い方をする場合は、noticeとalertだけを使います。コントローラーでflashにメッセージを設定します。
“`test_controller.rb
flash[:alert] = “アラートです。”
flash[:notice] = “注意事項です”
redirect_to test_url
“`

flashの変数の中身を見ると、alertとnoticeに値が正しくセットされていることが確認できます。
“`
#, @flashes={“alert”=>”アラートです。”, “notice”=>”注意事項です”}, @now

元記事を表示

Rails7でflash.nowを表示させる

### 解決したい事

私が出した質問なのですが、まずはご覧になってください。

https://qiita.com/woodman0224/questions/0eb98675a161c2dce0a5

記事の通りではありますがrenderはされてもflash.nowが表示されなくて困っていました。

### 解決策
たくさんの記事をよく読んでいると、もしかしてと思う事があったので試してみたらできました。

それはフォームでTurbo Drive を無効にするという方法です。
“` ruby
#sessions/new.html.erb

#改善前
<%= form_with(url: login_path, scope: :session, local: true) do |f| %>

#改善後
<%= form_with(url: login_path, scope: :session, local: true, data: { turbo: false }) do |f| %>

“`

やはり予想が正しくrailsのバージョン

元記事を表示

[Rails]特定のカラムの値を取得(pluck)

# Pluckメソッド
指定したカラムの値を配列で返してくれます。
“`ruby
モデル名.pluck(取得したいカラム名)
“`

【例】usersテーブル
| id | name | bounty |
| — | ——- | ——— |
| 1 | ルフィ | 30億 |
| 2 | バギー | 31億8900万 |
| 3 | ティーチ | 39億9600万 |
| 4 | シャンクス | 40億4890万 |

上記のような`users`テーブルから`name`カラムの値だけ取得したい場合、`pluck`メソッドを用いると便利です。`User`モデルを指定し、引数にカラム名`name`を渡します。

“`ruby
User.pluck(:name)

=> [“ルフィ”, “バギー”, “ティーチ”, “シャンクス”] # 返り値
“`
また、引数に複数のカラムを指定することもできます。
“`ruby
User.pluck(:name, :bounty)
=> [[“ルフィ”,”30億”], [“バギー

元記事を表示

Rails7.0.4 Ruby3.1 Mysql8.0 docker-compose で環境構築する。ついでにTailwindCSS と DaisyUI も入れちゃう。

# はじめに
勉強用にちいさなアプリを作成することがありますが、環境構築がめんどくさくて止めちゃうことありますよね?
環境構築で詰まらないように記録しておきます。

Rails の環境構築の記事はたくさんありますが、できるだけ最新のバージョンでやってみました。
Rails 7.0.4
Ruby 3.1
Mysql 8.0
# 参考

https://docs.docker.com/samples/rails/

https://qiita.com/croquette0212/items/7b99d9339fd773ddf20b

# プロジェクトの作成

“`sh
mkdir test-app
cd test-app
“`

# 設定ファイルの作成

“`Dockerfile:Dockerfile
FROM ruby:3.1

RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /mya

元記事を表示

SQLite3::SQLException: table “users” already exists というエラーが出た時の解決方法

# 結論: Usersテーブル削除する

ターミナルで
“`terminal
$ rails db

.tables   ###テーブルの一覧表示

drop table users ### usersテーブル削除

ctrl + d で抜けられる
““
以上

元記事を表示

has_manyのsourceオプションはいつ使うのか

has_manyメソッドのsourceオプションは次の場合に使用します。

1. 多対多のアソシエーションに別名をつける
2. has_manyで指定するモデル名が重複している

例として、ユーザーが投稿を作成・いいねできる関連付けを行います。
![qiita-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1881292/053db736-90b1-83ee-8377-7dc51705ef82.png)

#### いいねした投稿を取得する
“`ruby
#models/user.rb
class User < ApplicationRecord has_many :posts has_many :likes end #models/like.rb class Like < ApplicationRecord belongs_to :user belongs_to :post end #models/post.rb class Post < ApplicationRec

元記事を表示

コード譜投稿アプリを作る#6 (railsのプライマリキーをuuidに変更)

[← 前回の記事](https://qiita.com/t_sekky/items/2fe386ba8b74e89b06b3)

# 今回やること
これまでプライマリキーは特にいじらなかったので、idは整数型のオートインクリメント(1, 2, 3 …)になっています。
これから作る予定のサイトはユーザー投稿型のサイトにしたいので、idをuuidにして`/scores/1`のようなURLではなく`/scores/7a670050-7d74-473c-b322-0322b622b232`のようなURLでコード譜それぞれにアクセスできるようにします。

こうすることによるメリットは、
– URLが推定できてしまうのを防ぐ
– 全体のレコード数が把握できてしまうのを防ぐ

などがあると思います。
特にサービス立ち上げ当初は「ひとけ」がないのがバレやすいのもあるかなと。

トランザクションがめちゃくちゃ増えそうなサービス内容でもないですし、PostgreSQLであればuuidを採用してもパフォーマンスがめちゃくちゃ落ちるということもなさそうなので、今回は全面的にuuidを採用します。(mys

元記事を表示

Rspecの処理を共通化させる

– specフォルダ直下にsupportフォルダを作る
– 共通化したい処理を書いたモジュールを追記

“`ruby:json_api_helper
module JsonApiHelpers
def json
JSON.parse(response.body)
end
def json_data
json[“data”]
end
end
“`
– “`rails_helper.rb“`の23行目をコメントアウトする。これをコメントアウトすると、“`spec/support“`に入っているファイルをループで全て“`require“`する。

“`ruby:rails_helper.rb
Dir[Rails.root.join(‘spec’, ‘support’, ‘**’, ‘*.rb’)].sort.each { |f| require f }
“`
– “`rails_helper.rb“`の下記のブロックに“`include“`したいファイルを追記。**spec_helper.rbの似たブロックと間違わないように!!!*

元記事を表示

OTHERカテゴリの最新記事