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

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

redmine管理画面のuser一覧に、メール通知機能の情報を追加する

## ■やりたいこと
 管理画面のuser一覧に、メール通知機能の情報も表示させたい。

## ■環境:
Environment:
Redmine version 4.2.3.stable
Ruby version 2.6.9-p207 (2021-11-24) [x64-mingw32]
Rails version 5.2.6
Environment production
Database adapter Mysql2
Mailer queue ActiveJob::QueueAdapters::AsyncAdapter
Mailer delivery smtp
SCM:
Git 2.34.0
Filesystem
Redmi

元記事を表示

【Rails】eachの中でテンプレートをrenderをするのは危険である

早速ですが、みなさんはviewで部分テンプレートを利用されていますでしょうか?
こういうやつです。よく見ますね。

“`
<%= render 'path', user: user %>
“`

私はコードの見た目がきれいになるだけでなく、管理もしやすくなるといった理由から多用しております。

そんな便利な部分テンプレートですが、実は使いすぎるとパフォーマンスが悪くなってしまうことを知っていますか?
今回はその理由と改善点を説明できればと思います。

## eachの中でrenderを使ってはいけない

例えば以下のようなコードがあるとします。(適当な例です。こんなコード書かないよ、というのは一旦置いといてください。)

“`erb
<% @users.each do |user| %>
<%= render 'user', user: user %>
<% end %>
“`

で、これの何が良くないかですが、単純にパフォーマンスが悪いです。

雑な例ですが、10,000件のユーザを一覧に表示してみます。データはscaffoldとdb:seedで適当に作成しました。

元記事を表示

ActiveRecord で、関連先のテーブルの条件で絞り込む

# はじめに
ActiveRecord で、少し複雑なクエリを発行したかったのだが、書式が分からなかったので、自分用に調べためも。

# 状況
アソシーションは以下の User:Book = 1:N の関係。カラムなどは以下の状態とする(created_at など関係ないカラムは省いた)。
## User モデル
| カラム | 型 |
|:-:|:-:|
| id | int |
| name | string |
“`ruby:user.rb
class User < ApplicationRecord has_many :books end ``` ## Book モデル | カラム | 型 | |:-:|:-:| | id | int | | user_id | int | | book_type | int | | passed | boolean | ```ruby:book.rb class Book < ApplicationRecord belongs_to :user end ``` ## 紐づくBookで、type別の最新がすべて

元記事を表示

Railsチュートリアル7.3.4でハマった(ArgumentError)

# 内容
タイトルの通りです。ArgumentErrorのエラーが発生しました。
## 開発環境
ruby 3.1.1
rails 7.0.0

## テストコード
“`users_signup_test.rb
require ‘test_helper’

class UsersSignupTest < ActionDispatch::IntegrationTest test "invalid signup information" do get signup_path assert_no_difference 'User.count' do post users_path, params: { user: { name: "", email: "user@invalid", password: "foo",

元記事を表示

ActionCableを用いたチャットアプリでチャットルームとメッセージを紐づける方法

## 概要
 先日、[こちらの記事](https://techtechmedia.com/action-cable-rails6/)で解説されていたActionCableを用いたリアルタイムチャットアプリを動かしてみました。一通り動かせたのでこれを発展させて、複数のチャットルームを作りそれぞれに対してメッセージを投稿できるようにしてみたのでその方法をまとめました。

## 実装
※ [こちらの記事](https://techtechmedia.com/action-cable-rails6/)を前提とします。

最初に [こちらの記事](https://makolog.xyz/gem/)の通りにgonというgemをインストールします。これはコントローラからjavascriptへの変数の受け渡しが簡単に行えるようにするものです。

 ![ER](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261800/146f9360-6617-3733-9a9b-8bbebcb3581d.png)
 
“`ruby:co

元記事を表示

【個人開発】ランダムでカラオケで歌う曲を決めてくれるサービス「PICKUP TRACK」をリリースしました!

# はじめに
皆さんはカラオケに行った時、歌う曲に困った経験はありませんか?

最近はこのご時世なのでなかなかカラオケにも行きづらい状況ですが、私自身そういったことがよくありました。
また、私は一緒に行った友人の歌を聴くのも好きなので少しでも歌う曲に悩む時間を減らしたいとも思っていました。

そんな経験から自分と同じような悩みを持つ人に、よりカラオケを楽しんでもらいたいと思い、「PICKUP TRACK」を作成いたしました。

URL: https://pickup-track.com
GitHub: https://github.com/junjunpei/pickup_track
[![Pickup (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2564332/0ae464a7-32bf-17ac-96b4-b91ca10b5835.png)](https://pickup-track.com)

# サービス概要
※パソコン、スマホどちらからでも使用できますが、カラオケで使っていただくこと

元記事を表示

【個人開発】『書くこと(ジャーナリング)?』をもとに、感情の分析や習慣化サポートするアプリをリリースしました!!??

# ? はじめに

『書くこと(ジャーナリング)』をデジタルで実現し,感情の分析や習慣化しやすいようにサポートするサービス【Mikke(ミッケ)習慣ジャーナリング】をリリース致しました。
本サービスへの概要や想いなどを書きましたので、よければ最後までご覧ください。

:::note info
ジャーナリングとは…
「書く瞑想」とも呼ばれ, **頭に浮かんでいることを一定の時間内でただ紙に書いていく**というものです。
:::

【サービスURL】
https://a-mikke.com

# ? サービスを作った背景 / ✨ サービスに込めた想い
**自分の感情を言語化したり、思考の癖を理解することが苦手なこともあり、人と1対1で話すのが苦手でした。**

ある本をきっかけに **『書くこと(ジャーナリング)』を毎日するよう

元記事を表示

新人がよくやる間違い(MVCの領域侵犯編)

Railsを使ったアプリケーション制作を始めて2ヶ月ちょっと…。

こんな↓コードを書いていたら、先輩から「それはやばいよ」と指摘を受けました。

“`ruby
<% @users.each do |user| %>
user_type = UserType.find(user.type_id)

<%= user %>

<%= user_type.type_name %>

<% end %>
“`

なにがやばいのかわかりますか?

まあ、タイトルでネタバレしているのですぐわかってしまうと思うんですけど、**ViewでSQL文を書いている**んですね。端的に云うと、「それコントローラーでやれよ」ってことです。(さら言うとN+1問題も発生しているんですが、今回は割愛)

サンプルではリレーションのあるわかりやすい2つのモデルなので、コントローラーでらくらく書けるんですけど、

例えば直接的なリレーションのない2つのモデルを扱わないといけなかったり…

複雑な関係をもつ3~4つのモデルを同時に扱わないといけなかった

元記事を表示

Better ErrorsとBinding_of_callerを導入する(Rails+Docker環境)

## Better ErrorsとBinding_of_callerとは?

Railsのgemの一つでBetter_Errors gemを使うと便利で高機能なエラー画面が表示されます。

Binding_of_callerはブラウザ上でirbを使えるようになるgemです。

### Better Errorsとbinding_of_callerの導入

Gemfileに以下を記述します↓

“`Gemfile
group :development do
gem ‘better_errors’  #追加
gem ‘binding_of_caller’  #追加
end
“`

次にdocker-compose buildでコンテナをビルドします。
“`
$ docker-compose build
“`

**/config/environments/development.rb**に以下を追加します↓
“`
if Rails.env.development?
BetterErrors::Middleware.allow_ip! “0.0.0.0/0”
e

元記事を表示

Mysql2::Error: Unknown database ‘app_development’が急に出た

## 環境
macOS Monterey 12.3
docker-compose 2.2.3
mysql 8.0
rails 6.1.4
rails初心者が突然のエラーに出会い、もうrails諦めようと思ったので、経緯を含めて書きました。
半日くらいでエラー解消。

## 困ったこと

アプリ作成中に突然エラーが出ました。
“`
Mysql2::Error: Unknown database ‘app_development’
“`

> app_developmentなんてデータベースありません。

かな?いや、さっきまでずっと使えてたのに、、

[画像イメージ](https://rails-ambassador.herokuapp.com/debugs/NoDatabaseError)

## 試したこと

### 1. とりあえずコマンド打った
docker-compose exec web rails db:reset
docker-compose exec web rails db:migrate:reest
docker-compose exec web rails

元記事を表示

Rails7 + Vite + React + Bootstrap5の環境構築

# Rails アプリケーション作成

バージョンは適宜その時の最新のものにすればよさそうです。

“`
$ mkdir app-name && cd $_
$ rbenv local 3.1.1
$ nodenv local 16.14.0
$ rails _7.0.2.3_ new -d postgresql –skip-asset-pipeline –skip-javascript –skip-hotwire –skip-jbuilder –skip-test .
“`

“`
$ git add .
$ git commit -m ‘rails new’ -m ‘rails _7.0.2.3_ new -d postgresql –skip-asset-pipeline –skip-javascript –skip-hotwire –skip-jbuilder –skip-test .’
$ git remote add origin https://github.com/github-user-name/app-name.git
$ git push

元記事を表示

Rails 本番環境でmigrationファイルが反映されない

# 問題
本番環境のDBでrails db:migrateしても、データベースが変更されず、エラーが発生した。

# 解決方法
ENVを指定するだけで解決した。
“`
rails db:migrate ENV=production
“`

元記事を表示

deviseのログイン後、ログアウト後のリダイレクト先を設定する方法

# 環境

Ruby 3.0.2
Rails 7.0.2.3

# コード

“`ruby: app/controllers/application_controller.rb
class ApplicationController < ActionController::Base private # ログイン後のリダイレクト先 def after_sign_in_path_for(resource_or_scope) root_path #ここを好きなパスに変更 end # ログアウト後のリダイレクト先 def after_sign_out_path_for(resource_or_scope) new_user_session_path #ここを好きなパスに変更 end end ``` これだけです。 # 余談 ログアウト後の遷移先は設定必要だと思いますが、 ログイン後の遷移先は、例のように `root_path`にするならば、そもそも `config/routes.rb`で設定してあるので不要だと思います。 ```r

元記事を表示

【Nokogiri】スクレイピングして複数ある要素の最初の1つを取得したい

# 状況

Nokogiriでスクレピングしてogp情報を取得したところ、
対象のサイトのog:imageが複数あったため、
結果が複数URLを連結した文字列となってしまった。
(連結した文字列になったのは私のせいです…)
一つ目のURLだけ欲しいのに!!
という時です。

# 結論

`at_css`を使う。です。
“`
html = open(‘nokogiri_practice.html’).read
doc = Nokogiri::HTML.parse(html)

doc.at_css(‘//meta[property=”og:image”]/@content’)
“`

# at_css, css
`at_css`と`css`はcssセレクタで指定した要素を取得するメソッドです。

## at_css
`at_css`は複数ある要素のうち、最初の要素を取得してくれます。
指定の要素がない場合は`nil`を返します。

## css
`css`は指定した要素を配列型式で全て取得してくれます。
指定の要素がない場合は空の配列を返します。

### 参考
[RubyでWe

元記事を表示

【Rails】カレンダーの月めくりajax化

# 環境
Ruby 2.6.3
Rails 5.2.6
本番環境 Nginx/Puma/Linux2/AWS EC2/MySQL

# この記事でわかる事
simple_calendarを実装させましたが、月を翌月や先月に切り替えるとリロードをしてしまうので
カレンダーのみ非同期で更新させる方法を解説します。

※simple_calendarの実装は以下記事を参考にさせていただきました。
[【rails】simple_calendarを使ってカレンダーつきのブログ機能を作ってみた。](https://qiita.com/isaatsu0131/items/ad1d0a6130fe4fd339d0?)
[【Rails】simple_calendarを使ってカレンダーつきのmemo機能を作る。](https://note.com/yukinooffice/n/n36789d96ba5d)
# 実装方法
## 非同期処理のざっくり手順
1. 更新トリガーを `remote :true`にする
1. 更新させたいviewを部分テンプレート化する
1. アクション名.js.erbファイルを作

元記事を表示

【Docker】Rails API + Reactの環境構築

## はじめに
 本記事は、プログラミング初学者、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## DockerでReactの開発環境を構築する方法
### Docker-compose.yml

“`docker-compose.yml
version: ‘3.9’

services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: passwordadmin
MYSQL_DATABASE: mydb
MYSQL_USER: root
MYSQL_PASSWORD: passwordadmin
TZ: ‘Asia/Tokyo’
command: mysqld –character-set-server=utf8mb4 –collation-

元記事を表示

cancancanのテストをRSpecで書く

cancancanを使った際、テストに学びがあったので投稿します。

# 前提:cancancanとは

権限による制御が簡単にできるgemです。
– [cancancan](https://github.com/CanCanCommunity/cancancan)
– [Rails|CanCanCanの使い方解説](https://weseek.co.jp/tech/1211/)
↓私も1つ記事を書きました。
– [cancancanでモデル名に紐づかない制御をする方法](https://qiita.com/m-ito27/items/784f22bec151cc2f1e28)

# cancancanのテスト
requestスペックなどで特定の権限が各アクションを実行できるかどうかをテストする方法もあると思いますが、今回はcancancanが用意しているmatcherを使ってテストする方法を紹介します。

– 参考
https://github.com/CanCanCommunity/cancancan/blob/develop/docs/testing.md

“`ruby:a

元記事を表示

docker-composeで環境変数が読み込めないときの対処法。[WARNING: The MYSQL_ROOT_PASSWORD variable is not set.]

Rails(API) + MySQL + Reactという構成でポートフォリオを作成する中で、ローカルで開発したものをコンテナに入れて動かす際に環境変数関係でハマりました。

原因は簡単なことでしたが、解決までかなりの時間がかかったため、その道のりを記録に残しておきます。

## 前提条件
・macOS Monterey v12.1
・ruby 3.0.3
・Rails 6.1.5
・MySQL 8.0.28
・Docker 20.10.12
・Docker Compose v2.2.3

## やりたいこと
`docker-compose.yml`で`.env`に記載した環境変数を読み込みたい。
“`yml:docker-compose.yml
version: ‘3’

services:
db:
image: mysql:8.0.28
volumes:
– ./etc/my.cnf:/etc/mysql/conf.d/my.cnf
– hanger-talk_data:/var/lib/mysql
environment:

元記事を表示

Deviseで特定のステータスのユーザーにログインさせない方法とエラーの日本語化(Rails)

Deviseを使っていたRailsアプリケーションで、ログイン情報としてIDとパスワードとは別に、**特定の条件をユーザーが満たす場合にそのユーザーのログインを許可したくない**場面があり、その際の制御と日本語表示を学んだので備忘として記載します。

# やりたいこと
ユーザーはメールとパスワードでログイン可否の認証を行なっている。
しかしながら、ユーザーテーブルにはロック状態かどうかを判定するカラムがあり、ユーザーがロックされている場合にはログインさせたくない。
また、エラーメッセージを日本語化したい。

## 1. ユーザーにログインさせない方法

結論:Deviseが用意している[`active_for_authentication?`メソッド](https://github.com/heartcombo/devise/wiki/How-To:-Customize-user-account-status-validation-when-logging-in) を使う

“`ruby:user.rb
def active_for_authentication?
super &

元記事を表示

rails6 Bootstrapテンプレートでのエラー

こちらは、私がBootstrapのテンプレートを使用した時につまづいたエラーについて紹介します。

# 環境
ruby 3.0.2
rails 6.1.4
bootstrap 5.0.0-beta3
popperjs 2.10.2
webpacker 5.0

# エラー内容
bootstrpのテンプレートをインストールし、ダウンロードしたフォルダやファイルを自分のアプリに組み込んでいきます。
その時に、stylesheetsフォルダーに必要なcssやscssのファイルも一緒に移行しました。
そして、ローカルにアクセスして見たところ、
“`
Sprockets::DoubleLinkError
“`
こちらは、「同じ出力パスを持つ複数のファイルをリンクできない」というエラーのようでした。

# つまづいたポイント
Rails6からwebpackerがデフォルトでインストールされるようになりました。
webpackerでは、cssファイルではなくscssファイルを使用することでスタイルの編集が可能になります。
なので、stylesheetsフォルダー中にcssファイルかscssファイ

元記事を表示

OTHERカテゴリの最新記事