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

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

昔ばなし「Active Record の条件付きコールバックで苦戦太郎」

昔々あるところに、おじいさんとおばあさんが Web アプリケーション開発をしていました。
おじいさんはバックエンドを、おばあさんはフロントエンドを担当していました。

ある日突然、おばあさんはおじいさんに次のような仕様を言い渡しました。

「おじいさんや、`User` の `email` が更新された際に `some_function` が実行されるようにしておくれ。」

急な仕様変更に戸惑いながらも不承不承ながら了承したおじいさんは、とりあえず現在の実装を確認しました。
`user.rb` を開くと、以下のように実装されていました。

“`rb:user.rb
after_update :some_function, if: :saved_change_to_name?

def some_function
p “some_function called!”
end
“`

上記では `name` が更新された後に `some_function` が実行されるようになっています。

おじいさんは「`:saved_change_to_name?` を `:sa

元記事を表示

TypeError – no implicit conversion of nil into String エラーの解消

# エラーの状況
“`ruby
class XXX
def XXX
content = ”
content << @user.name return content end end ``` 空のstringクラスのcontentに、@user.nameで取得した値(今回の場合はnil)を結合して、そのcontentを返すメソッドをあるモデルに定義したが、`TypeError - no implicit conversion of nil into String` が発生した。nilからstringへの暗黙の変換はないとのこと。 # TypeErrorとは リファレンスから引用。 >メソッドの引数に期待される型ではないオブジェクトや、期待される振る舞いを持たないオブジェクトが渡された時に発生

contentのメソッド<<にnilが渡されていることが原因か? # Stringのインスタンスメソッド << ```ruby # 例 content = '' content << "tomato" p content # => “tomato”
“`
引数で与えられ

元記事を表示

パンくずリストの作成 breadcrumbs

# 導入
パンくずリストの導入にはgretelというgemが便利。
“`
gem ‘gretel’
“`
“`
% bundle install
“`
“`
% rails g gretel:install
“`
上記のコマンドで、configディレクトリ直下にbreadcrumbs.rbが作成される。

# パンくずリストの作成
例として、トップページ→投稿一覧→投稿詳細という階層のリストを作成する。
“`ruby
crumb :root do
link “Top”, root_path
end

crumb :post_index do
link “投稿一覧”, posts_path
parent :root
end

crumb :post_show |post| do
link “投稿詳細”, post_path(post)
parent :post_index
end
“`
対象のviewファイルに下記のように記載する。
“`erb
<% breadcrumb :post_index %>
<% breadcrumb :post_show, @po

元記事を表示

Rubyの条件分岐の使い分けについて

条件分岐を実装するシチュエーションがあり、使い分けの定義が曖昧だったのでいろいろ調べてまとめてみました。
基本的な内容です。

# 条件分岐とは
「〜な時〜な処理をする。」というものです。点数が80点以上であればgreat、60〜80点であればgood、60以下であればbadみたいな感じで結果に応じた処理を行うものです。
## if文
“`if 条件 then 処理 end“`のような感じで書きます。条件がtrueの時に処理が実装されます。
“`
if score >= 80
puts “Great”
elsif score >= 60
puts “Good”
else
puts “Bad”
end
“`

## unless文
“`unless 条件 then 処理 end“`のような感じで書きます。条件がfalseの時に処理が実装されます。ifの逆バージョンです。
“`
unless score >= 60
puts “合格”
else
puts “不合格”
end
“`

## case文
“`case 評価する式 when 条件 処理 en

元記事を表示

ActiveAdminのラジオボタンの初期値をセットする方法

# 概要
checkboxであれば、`input_html {value: :enabled}`で初期値をセットできた(はず)ですが、
radiobuttonだとうまくいかなかったのでnewアクション内で初期値をセットしました。

# コード
“`
ActiveAdmin.register Sample do
controller do
def new
@sample = Sample.new
@sample.show_flg = Sample.show_flgs[:enabled]
end
end

form do |f|
f.inputs do
f.input :show_flg, as: :radio, collection: Sample.show_flgs_i18n.invert
end
f.actions
end
“`

元記事を表示

昨日までの投稿を削除するバッチ処理

## 記事の対象者
バッチ処理で投稿のデータを管理したい人

## 前提条件
Ruby 2.6.3
Rails 6.1.5

## 実装の流れ
**1、削除プログラムの作成
2、gem【whenever】の導入**

## 削除プログラムの作成
app/libの配下にbatchフォルダを作成します。
次に作成したbatchフォルダの中でdata_reset.rbファイルを作成して以下を記述して保存します。

“`php:app/lib/batch/data_reset.rb
class Batch::DataReset
def self.data_reset
@activity_points = ActivityPoint.all.where(“date <= ?", Date.yesterday) @activity_points.delete_all p "前日の活動拠点を全て削除しました" end end ``` コードの解説をします。 私は活動日が昨日になっているものを削除するプログラムを作成しました。 ActivityPointモデル内にある

元記事を表示

[RSpec] トップレベルに定義されたメソッドをモックする方法

## サンプルコード
トップレベルに定義した`hoge`メソッドをモックして、モックできたことの検証を行うテストです。
“`ruby:hoge_spec.rb
require ‘rspec/core’

def hoge
‘👍’
end

RSpec.describe ‘トップレベルに定義されたメソッドをモックする’ do
it ‘モック前に👍を返し、モック後に👎を返す’ do
expect(hoge).to eq ‘👍’

allow_any_instance_of(Object).to receive(:hoge).and_return(‘👎’)

expect(hoge).to eq ‘👎’
end
end
“`

上記のテストをRSpecで指定して実行すると、成功します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468458/fa32148e-399f-5a6d-ebe8-8fab79e9fbdc.png)

## なぜ成立するのか?

元記事を表示

Railsでのアプリケーション新規作成手順

# はじめに
初心者なりにまとめたものになりますので、諸先輩方からは何書いてんだおめえと感じる部分があると思います。
そう感じた際は、お手数ですが、コメント頂けると幸いです。

内容としては、 ***フォルダ作成からSequel Proへのデータベース作成までの手順***になります。

## 目次
– ***アプリケーション新規作成手順***
-アプリ作成場所
-rails newの実行
-アプリ名のディレクトリにいることを確認
-データベースを作成

## アプリ作成場所
– ***作成したい場所へファイルを作成***
私は、ホームディレクトリに”projects”という名前のフォルダを作っている。

## rails newの実行
ターミナルを立ち上げ、ホームディレクトリにいることを確認(`pwd`を実行)した後、下記のコマンドを実行

#
rails バージョン名 new アプリ名 -d db管理システム名

例.
rails _6.0.0_ new first_app -d mysql

***解説***
– rails ~~~~ newの~~~~

元記事を表示

Rails2系? pagenateでdistinctしたかった

誰が今更こんなことを調べようか。

## 開発環境

* Ruby 1.8.7
* Rails 2.1.0
* SQLServer2008

~~なんだこの化石のような環境は~~

## 問題

pagenateでDISTINCTが使えない。

“`ruby
@data = VData.pagenate(:all,
:select =>’DISTINCT *’, # <= こういうのはNG :distinct => true, # <= こんなものはない :page => 1,
:per_page => 20
).distinct # <= できません ``` ## 調査 調べても新しいのしかでないよね。そりゃ。 と思ったらこんな記事が。 https://rubricks.hatenadiary.org/entry/20070419/1176957966 > paginateの中で
(1):distinctオプションがなぜか不正としてはじかれてしまう

> (2)paginateからcou

元記事を表示

【Rails】【いいね数】1人のuserの全ての投稿に紐付くいいね数を取得する方法

先日ポートフォリオを作成していた際に、少し悩んだことを復習がてら書いていきたいと思います。

### 【環境】
– Rails 6.1.5.1
– ruby 2.6.3

### 【前提】
– 投稿機能を実装済み(この記事では、Postモデル)
– いいね機能を実装済み(この記事では、Favoriteモデル)

### 【リレーション】
– UserとPost(1対多)
– UserとFavorite(1対多)
– PostとFavorite(1対多)

### 【実現したいこと】
 タイトル通り(少し分かりにくい日本語かも)ですが、ある1人のuserの全投稿に紐づく全てのいいね数を表示させたいと思います。
 userの詳細ページを作成している際に、この全いいね数を表示させたいなと思ったのがきっかけです。

### 【方法】

#### ①userの全投稿数を取得(関係ないですが、復習のため)
 これは簡単ですね!countメソッドを使って数えます。
“`ruby
user.posts.count
“`
#### ②次に、1つのpostに紐づくいいね数

“`ruby
post.

元記事を表示

stylesheet_link_tagとstylesheet_pack_tagの違い(自分用)

https://zenn.dev/ryouzi/articles/da8a77accc221e

元記事を表示

minitestでエラー`block (2 levels) in

# はじめに
minitestでテストを書いていると、
下記の部分でfailになった。
“`言語名:ターミナル
FAIL[“test_index_as_admin_including_pagination_and_delete_links”, #, 2.8298179999983404]
test_index_as_admin_including_pagination_and_delete_links#UsersIndexTest (2.83s)
Expected at least 1 element matching “a[href=”/users/14035331″]”, found 0..
Expected 0 to be >= 1.
test/integration/users_index_test.rb:19:in `block (2 levels) in

元記事を表示

[React/Rails] WebSocket connection to ‘ws://localhost:3000/ws’ failed が発生してレスポンスが受け取れない

## 動作環境
MacOS M1 BigSur 11.6
Docker “20.10.8”
node “14.17.5”
yarn “1.22.5”
react-scripts “5.0.1”
axios “^0.27.2”
Rails “6.1.6” APIモード

## 結論
Reactのルートディレクトリ直下に.envファイルを作成し、下記の記述をする
“`/.env
WDS_SOCKET_PORT=0
“`

## エラー内容
React/TypeScriptで作成したアプリケーションからRailsのAPIへリクエストを送信したところ下記エラーが発生した。
![スクリーンショット 2022-06-20 22.41.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685944/4c8c1ab2-2ef2-3cf2-533c-a931cb35fcd3.png)

“`
WebSocket connection to ‘ws://localhost:3000/ws’ failed
“`

元記事を表示

【rails】プルタブ式の生年月日フォームを簡単に追加するDay6

今日もお疲れ様です。今日はhtmlのパーツの配置とdeviseでユーザー登録機能を導入していました。今回は下写真のようにプルタブ式の”生年月日”を追加で実装するrailのヘルパーメソッド「f.date_select」について、簡易的にまとめます。
![スクリーンショット 2022-06-20 22.35.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707093/e83161b2-b88a-7888-1366-9f42715b08a7.png)

# 生年月日をテーブルに登録できるようにする
顧客に入力してもらった生年月日をデータベースに登録する場合はお読みください。やり方は結論から言って、マイグレートファイルにカラムを追記し、生年月日データを受けと取れるようにする必要があります。記述方法は以下
“`ruby:〇〇〇〇〇〇〇〇_create_テーブル名.rb
t.date :birthday
“`
注意点ですが、記述する前に「rails db:migrate:status」でマイグレート

元記事を表示

はじめての環境構築 ~WindowsでRailsの開発環境を構築する~

**はじめての環境構築 ~WindowsでRailsの開発環境を構築する~**

# 1. はじめに

## 1-1. 対象読者

– Windows 10 / Windows 11 のユーザー
– 開発環境の構築に自信がない
– 構築中にエラーが出たが、対処方法が分からない

## 1-2. 実行環境

– OS: Windows 11 Home 21H2 64bit
– PC: LAVIE HZ750/L
– CPU: Intel Core i7-8550U
– メモリ: 8GB

## 1-3. Windowsに構築しようと思ったきっかけ

Railsを学習するためにMacBookを購入したのですが、開発効率が思ったより向上しなかったので、慣れ親しんだWindowsに戻すことにしました。

MacはM1チップだったこととシェルがZSHだったことのどちらかが原因でgemのインストールに苦労しました。また、ExcelやWinMerge、サクラエディタ、psqleditといったツールを開発の補助で使用していますが、Macには同等のツールが存在しません。

## 1-4. 注意点

元記事を表示

【Rails】【MySQL】Mysql2::Error: Specified key was too long; max key length is 767 bytes

昨日分の記事を投稿し忘れていました。こんばんは。今日はテックキャンプ現役受講生のアプリ開発Day4です。トップページのレイアウト作成とdevise導入をしていました。そこで遭遇したエラーについて概要と解決方法について紹介します。

# Caused by:Mysql2::Error: Specified key was too long; max key length is 767 bytes
railsでdeviseのマイグレートファイルをマイグレートしようとしたときに出てきたエラーです。エラー内容を要約すると、「mysql2では767バイトのデータしか登録できないのに、deviseで作ろうとしたキー(カラムのこと?)は許容量をオーバーしてます。」というものです。一応エラーが出てきた経緯を記述した上で、解決方法を最後に記入しています。
# エラーが出るまでの経緯

①まずはアプリケーションとDBを準備します。
“`ruby:ターミナル
rails _6.0.0_ new sample -d mysql
rails db:create
“`
②次にdevise導入のために、Ge

元記事を表示

【Rails】マイグレーションのロールバックを確認すべし

# 初めに

マイグレーションファイルを追加した後、ロールバックできるか確認していますか。

## 環境

– Rails 6.1.4
– Ruby 2.7.4

# マイグレーションのロールバック

開発を進める中でデータベースのバージョンを上げることがありますが、正しく動作しないマイグレーションがチームで共有されると、エラーが解消するまで開発が止まってしまいます。

マイグレーションを追加するときは、バージョンを上げるだけでなく、下げることができるようにするのが通常であると考えたほうがいい。

## ロールバックできるかを確認する

エラーを防ぐために、バージョンを上げた後にロールバックし、もう一度バージョンを上げて確認をします。

1. まずは`rails db:migrate`でバージョンを上げてエラーが起きるかを確認する。

2. その次に、`rails db:migrate:redo`を行い、バージョンを下げて後にもう一度上げてエラーが起きないか確認する。

`rails db:migrate:redo`はマイグレーションのバージョンを下げた後に上げて元に戻します。

#

元記事を表示

rails renderの使い方(自分用)

renderを同じメソッドで2回使うときは and return またはreturn でメソッドから脱出させる必要があるみたい

https://pikawaka.com/rails/render

元記事を表示

Create Factory Bot instances out of rspec

If you want an instance created by Factory Bot, say in a rails console, follow this.

“`rb
$ bundle exec rails

> class Object
> include FactoryBot::Syntax::Methods
> end

> create(:user)
“`

元記事を表示

rails db:seedできなくなった

# rails db:seed できなくなった
## rails db:seed とは
Railsには、初期データを追加するためのシード機能が備わっており、「seed.rb」ファイルにデータを記述していきます。
例えば、
“`
Customer.create!(
email: “aaa@amail.com”,
password: “a12345”,
nickname: “れいこ”,
profile: “令和生まれの道子です。”,
)
“`
こんな感じでCustomersテーブルのそれぞれのカラムにデータを保存(create!)します。
このような記述の集まりが、「seed.rb」ファイルで、それを実行するのが、“`rails db:seed“`というわけです。
## エラー
rails db:seedをすると、既にemailがデータベースにあるようで、バリデーションエラーとなりました。
## TRY
1. x
“`
rails db:reset
rails db:seed
“`
2. x
“`
rails db:drop
rails db:migrate
rail

元記事を表示

OTHERカテゴリの最新記事