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

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

accepts_nested_attributes_forは非推奨だから使わないほうがいいのか

※`accepts_nested_attributes_for` の使い方を説明する記事ではないです。

### 概要
`rails accepts_nested_attributes_for`でググると`非推奨`がサジェストされたり、これを使わずに別の方法を取っているような記事が複数ヒットします。

私自身も結構前にコードレビューで「非推奨だよ〜」みたいなコメントをもらったことがあり、その時はそのまま直さなかった気がするのですが、また実装する機会があったので今どういう状況なのか改めて調べてみました。
チーム開発での話なので、個人で使う使わないは自由にしてください。

### いつ誰が非推奨と言ったか

非推奨なら普通`deprecated`の警告が出ますよね?
非推奨のソースってどこなんでしょう。
↓ここのようです。

https://github.com/rails/rails/pull/26976#discussion_r87855694

> dhh on 15 Nov 2016
>
> I’d actually like to kill accepts_nested_at

元記事を表示

【Rails】booleanは実質メソッド!?と感じたこと

# はじめに

Railsアプリケーション開発中にbooleanのカラムに対してこんなコードに遭遇した

“`ruby:db/migrate/create_post.rb
class Posts < ActiveRecord::Migration[5.2] def change create_table :posts do |t| t.string name t.boolean draft, comment: '下書き' end end end ``` ```ruby:post.rb // 下書きがどうかを判定するメソッド def draft? draft == 1 end ``` ## マジックナンバーは使用しない まず大前提としてマジックナンバーの使用は避けた方が良い。保守性に影響がでてしまう。 https://qiita.com/daichi0713/items/d838eda12a664bc04542#4%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%8

元記事を表示

【rails入門】javascriptを用いてカーソルを制御する

# はじめに
皆さんこんな経験ありませんか?

![スクリーンショット 2022-04-15 11.41.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/eddd0af0-5dbb-3b62-1aca-e1fd8cc94197.png)

ログインするときメールアドレスの次にパスワードを入力しようとしたけど、保存してるパスワードとか予測変換とかでパスワードの入力欄が隠れてしまう!!

# 今回やること
javascriptを用いてメールアドレスを入力し終わってenterを押すと自動でパスワード入力欄にカーソルが合わさるようにする

# 早速やっていきましょう!
前提としてrailsでdeviseというGemを使用してログイン機能を実装しているとします!
### 1.現状のコード
“`html:views/users/sessions/new.html.erb

ログイン

※登録したメールアドレスとパスワードを入力してください。

<%=

元記事を表示

RuboCop::Cop::Rails::PresenceというRubocupの指摘

Rubocupでリファクタリングをしていたところ、モデルのメソッドで次の指摘を受けました。

“`ruby:models/sample.rb
C: [Correctable] Rails/Presence:
Use [別テーブルのidを格納した配列を弄る処理].presence || []
instead of [別テーブルのidを格納した配列を弄る処理].blank? ? [] : [別テーブルのidを格納した配列を弄る処理]
変数 = [別テーブルのidを格納した配列を弄る処理] ? [] : [別テーブルのidを格納した配列を弄る処理]
“`

元の記述は配列を処理した結果、空配列であれば空配列を、そうでなければ処理した結果の配列を返すという単純なものですが、同じ記述を2回繰り返す点でDRY原則に沿った書き方ではありませんでした。

今回の指摘で簡潔に書けることがわかりましたが、これまで見かけない記述でしたのでまとめておきます。

## 短絡評価について

https://qiita.com/gyu-don/items/a0aed0f94b8b35c43290

>||の

元記事を表示

画像キャッシュを部分的に無効化する

Imagemagickを深掘りするため、ユーザー画像とアイテム画像を合成させて、簡易的に試着ができるという機能を実装していた。

![9ab908fcf945ef3911f996ea2d4757e7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2584427/6c34fefb-aa1f-127b-cdc3-432f7e5790ba.jpeg)

上の画像はパンツの画像とユーザー画像を合成させているが、それぞれのアイテムページから試着ページに遷移するとそのアイテムの画像とユーザーの画像が合成されるという機能で、
例えばジャケットのページで試着ボタンを押すとジャケットの画像とユーザー画像が合成される様になっている。

が、

ローカル環境では問題なく動いていたのに、AWSにアップロードした後試着ページを表示させると一番最初に合成した画像が別の試着ページに遷移しても表示されてしまい、二回目以降は試着できなくなってしまった。

[![Image from Gyazo](https://i.gyazo.com/

元記事を表示

ransackを使った検索機能実装

この記事は勉強した内容をアウトプットし、理解を深めるための学習用記事になっています。
説明の間違えている点などありましたらご指摘いただけると幸いです。
# ransackを使った検索機能実装について

## 実装手順

#### 1. gemに’ransack’を追加してインストール
“`ruby
gem ‘ransack’
“`
“`ruby
$ bundle install
“`
bundle install後にサーバーを立ち上げ直すのを忘れていて30分くらいエラーで引っかかりました、、、
bundle install後にはrails sを忘れずに!

#### 2. コントローラでの記述
このときに私は事前に投稿の一覧を表示させるとずっと勘違いしていました。なので投稿一覧用の変数# @dishes = Dish.allを準備していました。
調べているとransackではデフォルトで一覧画面できるみたいです!
“`ruby
def index
# @dishes = Dish.all
@q = Dish.ransack(params[:q])
@s

元記事を表示

[個人開発]実際に飲食店で使う予約サービスを実務未経験者が1から考え作ってみた。

# はじめに

この度、実際に飲食店で使っている予約サービスをリリースしました!

##### サービスを作ったきっかけ
私が以前、手伝いをしていた個人経営の小規模な飲食店では事前の来店数を把握したいが予約受付はは営業時間内の電話のみ。予約来店が少ないという課題を実感していました。その解決策として、お店の要望に沿った予約サービスを開発しました!

実際に使えるような予約システムの参考資料がなく苦労しましたが、初心者なりに1から考え、実装してみました。

# サービス概要
一般ユーザーの予約来店を促し、管理ユーザーの業務効率化を図るサービスです。

https://www.lunchcafeocean.com/

こちらは公開用のクローンサイトです。
実際に使っているものと機能は基本的には同様です。

ゲストログインボタンからは管理画面にアクセスでき機能の確認が行えます。

#### 一般ユーザー
– Web予約より日付、人数、時間を指定して予約ができる。
– メニューやキャンペーン情報を確認できる。

#### 管理ユーザー
**予約管理**
– Web予約に限らず、その他予約も一

元記事を表示

Ruby を書き始めてハマったこと

## `String` なのか `Symbol` なのか

Ruby には `Symbol` という、文字列の皮を被った数値があり、少メモリで高速なことから、`Hash` のキーとかでよく見かけます。

自分で作った `Hash` であれば誤解はないですが、メソッドから生成された `Hash` のキーが `String` だったりすると、キーを指定しても `nil` が返ってきて、「俺が入れたデータが無くなっとる!」と焦ります。

### `JSON.parse` は `symbolize_names: true` をつけると `Symbol`

`JSON.parse` でそのままだと、キーは `String` になる。

“`ruby
JSON.parse(‘{“name”:”tanaka”,”age”:19}’)
=> {“name”=>”tanaka”, “age”=>19}
“`

`symbolize_names: true` をつけるとキーが `Symbol` になります。

“`ruby
SON.parse(‘{“name”:”tanaka”,”age”:19}

元記事を表示

【rails入門】javascriptを用いてチェックボックスの値を維持する Ver-2.0

# はじめに
この記事は以前投稿した[【rails入門】javascriptを用いてリロードしてもチェックボックスの値を維持する(本題)](https://qiita.com/Naoya_pro/items/c3e8c450302aca6053f4)という記事でやっていたことと同じことをよりスマートに書いたものです!
プログラミング初心者の僕にコメントでご教授いただいたことに感謝してこの記事を書いています!それでは早速やっていきましょう!!
# 現状とやりたいこと
* ゲーム名がランダムで1つ表示されるようなガチャを作りたい
* タグ検索機能を使ってジャンルを絞り込めるようにしたい
* 絞り込む時に使用するチェックボックスを**リロードした時も、リロード前と同じ値を維持したい**

今回は3つ目の`リロードした時も、リロード前と同じ値を維持したい`これをやっていきます:scissors:

![Something went wrong]()

## 1.今のチェックボックス
現状こんな感じでチェックボックスをrailsで作っています
“`ruby:gatya.html.erb
<%=

元記事を表示

undefined method `downcase’ for nil:NilClassエラーの対処法

開発環境
mac OS バージョン11.6
エディタ
VScode

# やりたいこと
gravataを使ってUserのアイコン画像を表示させる。

Users#indexのページを表示させたい。

# エラー内容
“`
undefined method `downcase’ for nil:NilClass
“`

![f6f2ba52cfc2771cff05373e7dfa3311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962714/aff9e721-4368-450c-f37f-21f83bad0d63.png)

# 原因
Usersテーブルの中にあるレコードについて、emailがnilのデータが混入していることが考えられます。
.downcaseはemailカラムの文字列を全て小文字に変換する処理で、emailがnilだと変換できないのでエラーになります。

# 解決策
“`raill c“`でemailがnilになっているデータがないか確認し、あったらdestro

元記事を表示

WHERE A and (B or C)をActiveRecordで記述する方法

Railsアプリケーション開発中に、`WHERE A and (B or C)`のようなSQLをActiveRecordのデータアクセスメソッドで書くときにどうすれば良いのか少しハマったのでメモとして残します。

“`sql:SQL
SELECT *
FROM model
WHERE A and (B or C) ;
“`

# 結論
`merge`メソッドを使用する。
括弧に該当するメソッドが`merge`メソッドとなる。
“`ruby:ActiveRecord
Model.where(A).merge(where(B).or(where(C)))
“`

# 例: ポケモン
例えば、こんな感じのポケモンテーブルがあったとする
“`ruby:db/migrate/pokemon.rb
class Pokemons < ActiveRecord::Migration[5.2] def change create_table :pokemons do |t| t.string name t.string type end en

元記事を表示

Rubyで気象庁過去データからのスクレイピング

# 今回の目的
職場の農業法人で25ha全43枚の畑の管理を任されていまして、枚数と種類が多すぎて作業の管理が不可能でした。
そこで、定植日からの積算温度(1日の平均気温を積算した値)一瞬で確認できるものがあれば便利だと思い作ってみました。

# なにをするのか

https://www.data.jma.go.jp/obd/stats/etrn/index.php

こちらから情報を頂いてきます。天気予報のAPI(ぽいもの)は配信されているようですが、過去の気象データはこの表かcsv形式でしか配信されておりません。
![スクリーンショット 2022-04-14 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512596/745abb7c-9c96-538d-d4a2-803d5b87dd28.png)

この平均気温の行を取得してきて合計します。(0度以下は0として扱う)
Mechanizeを使ってスクレイピングします。

# ソースコード

“`ruby:
require “Mecha

元記事を表示

docker, rails, mysql, skip-javascript, skip-turbolinks, webpackの環境構築

jsを触る機会が増えてきたので、Dockerを使って環境構築の練習中です。
いろいろ手探りでやってみた結果、一応、dev環境は動くようになった。

# docker, rails, mysql, skip-javascript, skip-turbolinks, webpackの環境構築

ファイル全体は、 https://github.com/kkosuke/2022-04-14-rails-demo を参照してください。

## rails

### 任意のディレクトリ内で…
“`
rails-demo $ touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh}
“`

### docker-compose.yml
“`
version: ‘3’
services:
demo_db:
container_name: demo_db
image: mysql:5.7
environment:
MYSQL_DATABASE: root
MY

元記事を表示

Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at)の倒し方

Action_Mailerを使い、gmail経由でメール送信したかったが、`Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at)`が連発してのでメモリます。

## 結論

user_name と password は環境変数におくべし。

## 実際のコード

ガイドにある通りconfig/environments/development.rb に以下を追加

“`ruby
# MailCatcher Configuration
config.action_mailer.raise_delivery_errors = true

config.action_mailer.perform_caching = false

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = { address: ‘smtp.gmail.com’

元記事を表示

Rails 後からNot null 制約を付与する

テーブルのカラムに、後からNot null 制約をつける手順を書いていきます。

まず、新たに Not null 制約を付与するためのマイグレーションファイルを作成します。

“`
rails g migration ChangeCloumnsNotnullAddテーブル名
“`

“`
# rails g migration ChangeCloumnsNotnullAddMovies
“`

マイグレーションファイルを作成

“`db/migrate/***_change_columns_add_notnull_on_movies.rb
class ChangeCloumnsNotnullAddMovies < ActiveRecord::Migration[6.0] def change change_column :users, :title, :string, null: false change_column :users, :image, :string, null: false change_column :users, :re

元記事を表示

【Docker/MySQL】DBバックアップの取得・復元する手順

# はじめに
RailsアプリケーションでDBにMySQLを使用して開発しており、DBのデータを一時的に残して作業をしたいことがありました。
本記事では、バックアップと復元方法の手順を記述しています。

## 前提
Ruby: 2.7.3
Rails: 6.1.5
MySQL: 8.27
Docker: 20.10.5

## 開発環境構成図
docker-composeコマンドを実行してRailsコンテナとDBコンテナを立ち上げています。
今回はDBコンテナに接続しバックアップ作業を行います。

![スクリーンショット 2022-04-14 12.45.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/fd454282-2038-cc13-aff6-bdea0038de0a.png)

# 作業内容
## Dockerコンテナにログイン
バックアップ取得、復元作業はコンテナ内で行います。

“`
docker exec -it DBコンテナ名 bash
“`

## バックア

元記事を表示

【備忘録・Rails】Mysql2::Error: Specified key was too long; max key length is 767 bytes エラーを解決する方法

## はじめに

こんにちは、だいごです。
今回はタイトルのエラーを解決する方法をまとめていきます。
よかったらご覧ください。

## エラーについて

まず、今回発生したエラーはターミナルにて**rails db:migrate**を実行した際に発生しました。
エラー文は以下に記します。

“`zsh:ターミナル
ユーザー名@コンピュータ名 カレントディレクトリ % rails db:migrate

# エラー文
== 20220413235353 DeviseCreateUsers: migrating ================================
— create_table(:users)
-> 0.1096s
— add_index(:users, :email, {:unique=>true})
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Specified key was too lo

元記事を表示

Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)’ has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)’ instead.という警告

railsコマンドを実行するたびに下記の警告文が出てきます。

“`
# rails db:migrate
Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)’ has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)’ instead.
“`

ここではこの警告を出なくさせる方法を書いていきます。

参考:https://github.com/rubygems/rubygems/issues/5234

# 解決策
どうやらbundlerのversionを変えると出てこなくなるみたいです。

参考記事によると
Also, just to make sure there’s an easy way out of this posted here, running

“`bundle _2.3.3_ update –bundler“`

と書いてあるので、今のversi

元記事を表示

link_toとform_tagのデフォルトメソッドについて。

## 結論

“`link_to“` メソッド -> “`GET“`メソッドがデフォルト。
“`form_tag“`メソッド -> “`POST“`メソッドがデフォルト

### link_toメソッド
下記のようなroutes.rbメソッド違いの同じURLが存在する時、postメソッドのURLにリンクするためには“`{method:”post”}“`が必要です。(“`{method:”post”}“`がないと、getメソッドのパースにリンクされてしまう。)

“`routes.rb
post “posts/:id/destroy” => “…”
get “posts/:id/destroy” => “…”

“`
“`show.html.erb
<%= link_to (”destroy",”/posts/#{@post.id}/destroy),{method:"post"}) %>
“`

### form_tagメソッド
form_tagメソッドですと、“`post “posts/:id/destroy” => “…”

元記事を表示

【rails入門】javascriptを用いてリロードしてもチェックボックスの値を維持する(本題)

# やりたいこと
リロードしてもチェックボックスの値を維持する
### 実装したらこんな感じ

![F6A423F6-1560-42D2-BB05-C1124C3AB16E_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586059/40ce2d62-f899-5192-fced-6059f64e4d50.jpeg)

# 仕組み(ゴリ押し)
1. javascriptで全てのcheckboxのtrue/falseをリストに格納
1. そのリストを「次へ」ボタンが押されたときにコントローラに送り、保存する
1. 「次へ」ボタンを押したらリロードするので、その時にデータベースから最新のcheckbox情報が入ったレコードをviewに渡す
1. 受け取ったリストに基づいてjavascriptを用いてチェックをつけていく
# 実装
checkboxがtrueかfalse保存する用のモデル作成!
1行ずつ実行してください
“`ruby:ターミナル
rails g model Check 

元記事を表示

OTHERカテゴリの最新記事