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

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

【やっとわかった】self.っていつ使うん?(実務コードから見たクラスメソッド、インスタンスメソッドの使い分け)

## はじめに
Rubyのコードでたまに**self.name**みたいな感じでselfがついているコードをしばしば見かけるときがあります。Java、C#、Javascriptだとthisみたいなものですが、そもそもこのselfって「何を意味してるの?どんなときに使うの?」と疑問に思っていました。

今回Rubyの参考書でチェーリー本として有名な[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E6%94%B9%E8%A8%822%E7%89%88-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%

元記事を表示

Railsで外部参照しているはずなのにできない

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

ここを参考にテーブルの主キー以外をキーにして外部テーブルを参照できるように設定したのですがうまくいっていなかった

https://qiita.com/tanutanu/items/6c53b5290eaa9bf905d3

# 解決方法

原因はRubocopのエラー修正のためにつけたinverse_ofでミスをしていました

“`
belongs to :model, foreign_key: ‘key_name’, inverse_of: :self_model

belongs to :model, foreign_key: ‘key_name`, inverse_of: :self_models
“`

`s`をつけることで参照ができるようになりました

元記事を表示

Railsでdb:migrateやdb:rollbackができなくなったときの対処方法

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Migrateをする際にテーブルが外部のテーブルに依存する(外部キーなど)ときに、うまくmigrateやrollbackができないことがあります。一部レコードが外部キーを持っている状態のままレコードに入っていたりするので起きていることがあります

# 対処方法

まずは参照元、参照先のテーブルを削除していきます

“`
$ rails c
$ Model1.destroy_all
$ Model2.destroy_all
“`

ここではmigrateしたいテーブルにModel1とModel2が紐づいていると仮定しています

またmigrateは途中まで成功しているとロールバックしないので(migrateファイル単位で判断するので失敗したときにはそのファイルの内容のみをロールバックしているので成功したファイルはロールバックされない)、`duplicated`というエラーが出た場合は

元記事を表示

WSLでDockerを動かしたが、Railsコンテナがupしたときにmkdirでpermision deniedになる

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Gitのリポジトリに管理していたRailsのDocker環境をローカルにクローンしたところ`permission denied`が発生した

# 解決方法

Gitにあげたときの権限のあるユーザーといまクローンしてきた環境のユーザーの権限が異なっていたので問題になっていた
権限を変えてあげれば解決する

“`
$ sudo chown -R ユーザー名:グループ所有権 ./*
“`

この例ではローカルのユーザが扱えるようにクローンしてきたファイルに権限を与えている

元記事を表示

Railsで途中からDBをsqlite3からmysql2に変更するだけなのに死んだ

# 前提
– develop環境でsqliteを使うと、production環境(AWS)への移行が面倒そうなので、mysqlに変更しようと思った(本番はmysqlを使いたいから)
– まだ1度も`db:migrate`していない状態から作業した
– そもそも`rails new アプリ名 -d mysql`でデフォルトのDBをmysqlにできる
– ruby “3.1.2”
– rails “7.0.3.1”
– M1MacBookPro

# 最初の躓きポイント
– Gemfileからsqlite3を消し、mysql2を追加して`bundle install`でエラー
– `ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)`
– 原因はmysqlをPCにインストールしてなかったこと
– homebrewでmysqlをインストールしたらパス

# 次の躓きポイント
– config/database.ymlをmysql用に書き直す
– 具体的には、`

元記事を表示

Rails7 Mysql8 React TypeScriptで作る Docker環境

## はじめに
近しい記事はあれど、欲しい環境の記事を見つけられなかった
妥協して近しい記事をコピペで使おうとしたらエラーで動かなかった。
この際勉強にもなるし、自分で組んでみようということで作成しました。

## 前提
M1 Mac
基本的なDockerコマンドはわかる
エラーでハマった箇所を中心に少しだけ説明も入れる

## 求めた条件
Rails7 API
Mysql8 (認証プラグインを旧バージョンに変更)
React TypeScriptを使用する
`backend` `frontend` `docker-compose.yml`のシンプルな構成
`docker compose run <サービス> /bin/sh`等でコンテナに入って直接作業するのはなし
最近発生しているbundler特有のエラーを抑制する記載もいれたい

## 構成

“`
backend
– Dockerfile
frontend
– Dockefile
docker-compose.yml
“`

### バックエンド
*Dockerfile*
“`Dockerfile
FROM ruby

元記事を表示

[Rails]schema管理のgem ridgepoleを使ってみた

### 前提
記事を書いている私は現役のエンジニアではなくエンジニアを目指して学習中の者です。
よって、気をつけてはいますが記述内容には誤った内容が含まれている危険性があります。
その為この記事は参考程度に読んで頂き詳しい内容は公式の記述を参考にすることをおすすめします。

### この記事で実装すること
Ridgepoleというgemを使ってschema管理を実装します。
実際にPF等で使ったとかではなく、好奇心で触ってみたといったレベル感なので深堀りはしてないです。

### Ridgepoleとは・何がいいの?
クックパッドの人が開発したRailsのスキーマ管理用のコマンドラインツールのことです。
Railsのデフォルトで設定されているマイグレーションではテーブル内容に変更があった場合に
– 変更のためのmigrationファイルを作成するコマンドを実行
– ファイル内容を編集
– “rails db:migrate“を実行

のステップが必要ですがRidgepoleは直接スキーマファイルを変更してコマンドを変更すればテーブル内容を変更できます。
他にもテーブルごとにスキーマ

元記事を表示

ポートフォリオとして家事×バトルというwebアプリを作った。

# はじめに
ポートフォリオとして作成したWebアプリケーションの紹介記事です。

作成したアプリの概要
– 「家庭内の家事分担割合を可視化する」ことを目的に作ったWebアプリケーションです。
– サービス名は「家事×バトル」としました。
![スクリーンショット 2022-08-19 9.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948501/343208f9-01bb-2b68-0dae-be9e1cc9e3ca.png)

日々家事をこなしていると、夫と妻どちらが家事を多く実施しているか、客観的に評価することが難しいと思い、
実施した家事の量を集計して、比較することができるアプリを作成しました。

アプリのURLはこちらです。
https://kazi-battle.herokuapp.com/

githubのソースコードはこちらです。
https://github.com/shosuke1989/kazi-battle

# アプリの使用方法
別ページにまとめました。以下のリンク

元記事を表示

【Rails】nilを最後にソートしたい

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## 状況
“`User“`を“`Post“`の“`category_id“`の降順かつ“`nil“`を最後にソートしたいとき、このように書くと

“`ruby
User.eager_load(:posts)
.order(‘posts.category_id IS NULL’)
.merge(Post.order(category_id: :desc))
.select(‘users.*’, ‘posts.category_id AS posts_category_id’)
“`

下記のエラーと
“`
for SELECT DISTINCT, ORDER BY expressions must appear in select list
“`

下記の警告が出る。
これについては伊藤さんの記事がとても参考になりました。

“`
DEPRECATION WARNING: Dangerous query method (method who

元記事を表示

resources :~, only: %i[index] の”%i”は何者なのか

はじめに

ポートフォリオ作成で参考にしたコードで、ルーティングの設定を記述する際に”%i”という文字列が出てきて、どんな意味が分からなかったので調べたものを備忘録として残そうと思います。

%iとは何者なのか

どうやら、”%i”は「%記法」(パーセント記法)という形式の記法の中の一つのようです。

%iを使用することによって、シンボルの配列を作成してくれます。

https://railsdoc.com/page/symbol_info

例を見た方がイメージが湧くかもしれません。

~~~rb
# 例:
%i[red blue yellow white black]
# 下記の配列が作成される
[:red, :blue, :yellow, :white, :black]
~~~

%iを使用することにより、”:”を記述せずに配列を作り使用することができるということでした。

なので、今回の最初に疑問を持った式を使用すると、下記のようになります。
“:”を書く手間を省いたと言うことですね。

~~~rb
resources :~, only: %i[index]
# 下記

元記事を表示

【jQuery】ドロップダウンの開閉(クラスの変化)をトリガーにCSSの変更を動的に実装

# はじめに
ドロップダウンを開いた時に、cssを変更する操作を動的に行いたい。
railsのアプリ環境で行う。

# 環境
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |
4|jquery-rails|4.5.0
# 実装
[こちら](https://ayaka-weblog.com/programming/html-css-programming/wai-area-accordion/)の記事を参考にjsファイルを書いた。

# jsファイル読み込み設定
全ページにjsファイルを読み込むように設定する。
“`app/javascript/packs/application.js
// app/javascript を起点に記載
require (‘user/dropdown’)
“`

元記事を表示

【Rails】class有りの名前付きルートの使い方

# class有りの名前付きルートにする際の注意点
Usersコントローラーのnewアクションを作成し、Signupのリンクにする場合 。
“`ruby:routes.rb
get ‘users/new’
“`
erbでは生のHTMLを記載することが可能。
“`ruby:views/static_pages/home.html.erb

“`
users/newページへのURLをRails流にする際にSyntaxErrorがでることがある。
## 解決策
デフォルトのルーティングはやや回りくどいので名前付きルートを定義する。
“`ruby:routes.rb
get ‘/signup’, to: ‘users#new’
“`
link_toの後に””を付けて文字列にすること、class: “btn signup”がシンボルになることに注意する。
“`ruby:views/static_pages/home.html.erb
<%= link_to "Sig

元記事を表示

なぜcreateメソッドのparamsのみparams.requireメソッドが代入されるのか。

理解が曖昧だったため、整理のために記事を投稿。

それは**createメソッド**とそれ以外において、役割が異なるためである。
また、ここでは、newとindexメソッドは省く。

**createメソッド**の役割は、newのviewにおいて記載され、**ストロングパラメーター**となった(許可された)情報を取得し、保存することにある。
そのため、データベースのテーブルから、レコードを一つ取り出すメソッドであるfind(params[:id])は使えない。
そのため、**createメソッドに対し、params.requireの中身を代入すること**になる。

“`ruby:task.controller.rb

def create
@task=Task.new(task_params)
if @task.save
redirect_to tasks_path, notice: “作成しました”
else
render ‘new’
end
end

private

元記事を表示

JSONを受け渡しするRails APIのrequest specの書き方

# はじめに
一部React化で久しぶりにAPIを作成しました
JSONを受け渡しするRails APIのrequest specの書き方まとめです :sparkles:

## headersにContent-Typeを追加する
headersに`’Content-Type’ => ‘application/json’`を追加する
これでJSONのparamsを渡すことができるようになります

追加しないとデフォルトでは
`”CONTENT_TYPE”=>”multipart/form-data”`となり
数値やbooleanが文字列に変換されてしまいます
“`rb
describe ‘PATCH #update’ do
subject { patch xxx_path(article), headers: { “Content-Type” => “application/json” } }

end
“`

## JSONのparamsを用意する
“`rb
let!(:params) { { name: ‘タイトル’, body: ‘本文’ }

元記事を表示

RubyInstaller 3.1.2-1はまずgem install bundlerしましょう

言いたいことはタイトルで完了したので以下発生した問題と原因・解決方法です。

# 問題:rails newが通らない

ちょいと検証したいことがあって`rails new`しようと思い、devkitなしのバージョン入れてたことに気づいて(ネイティブライブラリビルドするgemがインストールエラーになって)、ついでなのでRubyInstallerでRuby 3.1.2を入れました。

で、`rails new`したところ、`bundle install`は通ったもののその後の処理でエラーが出てしまいました。

“`
rails importmap:install
rails aborted!
TZInfo::DataSourceNotFound: tzinfo-data is not present. Please add gem ‘tzinfo-data’ to your Gemfile and run bundle install
C:/TEMP/sample_app/config/environment.rb:5:in `

Caused by:
TZ

元記事を表示

【Rails】ヘッダーのドロップダウンをレスポンシブ対応

# はじめに
[こちら](https://qiita.com/vaza__ta/items/921b748df585bbbb4300)の記事で、ヘッダーをレスポンシブ対応するため、overflow-x: autoを実装した。
それにより表示領域から溢れた時はスクロールバーが表示されるようになった。

しかし、それによってドロップダウンの表示もスクロールバーが表示されるようになってしまった。
![scroll1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/c1bfb901-6074-ca79-6b91-1229582efdc9.gif)

そこで、スクロールバーに対応するoverflow-xの適応を、ウィンドウサイズの横幅が750px以下の時にのみにすることにした。理由としては下記となる。
・約770px以下からbootstrapによってヘッダーの表示フォーマットが変わる
・それ以下の750px以下であれば、overflowを設定してもドロップダウンがスクロールバー表示にならない
![s

元記事を表示

【Rails】gemのkaminariと配列を併用する場合について

## はじめに
ページネーションを実装する時にkaminariを使用することが多いと思います。
しかし、その前に取得したレコードを操作して配列になっていたりすると、そのまま`.page(params[:page])`を適用させることはできません。
このようなケースが個人開発であったのですが、応用的な使い方を知らず少々つまずいたので、今回記事に残しておくことにしました。

## やりたいこと
– Itemモデル全体をシャッフルして表示する
– 表示は、ページネーション対応で1ページに5個までにする
– kaminariのインストールは[こちら](https://qiita.com/you8/items/df68aaee3010e282d1ae)が参考になります

## 開発環境
Ruby 3.1.2
Rails 6.1.6

## 実装
そもそもページネーションを適用しないのであれば、shuffleメソッドを使用するだけで完了します。
“`ruby:items_controller.rb

def index
@items = Item.all.shuffle
end

.

元記事を表示

【Ruby】Faebook広告のデータをAPIで取得する

# 環境

Ruby 2.6.6
Rails 6.0.4.7
Gem facebookbusiness(Metaが出している公式のSDK)
(※ ググるとgem ‘facebook_ads’などが出てくるが、そちらではないことに注意)
API version v14.0(2022年8月最新)

# やりたいこと
1. Meta for DeveloperのAppにアクセス許可を渡しているすべての広告アカウントを取得する
2. それぞれの広告アカウントの、昨日のパフォーマンス(インプレッション、クリック、コストなど)を取得する

# ビジネスのちょっとした背景

ウチの会社はweb広告に力を入れていて、すべての事業のfacebook 広告アカウントを足すと使っていないものも含めて80アカウントくらいある…。(広告代理店かってくらい)

以前は各アカウントの担当者が毎日毎日手作業でgoogle spreadsheetに情報を入力して、ピボットやシートの連携で集計して、目視で確認して…とだいぶ作業が煩雑になっていた。それを、facebookのapiを叩いてspreadsheetの入力まで自動

元記事を表示

i18n

# セッティング
“`application.rb
module BooksApp
class Application < Rails::Application config.load_defaults 6.1 # デフォルト設定言語 config.i18n.default_locale = :ja end end ``` # 言語登録 ```ja.yml ja: greeting: "こんにちは。" title: "タイトル" memo: "メモ" author: "著者" picture: "画像" new: "新規作成" show: "表示" edit: "編集" destroy: "削除" back: "戻る" create: "作成" update: "アップデート" ``` # 表示方法 ```hoge.erb <%= t('greeting') %>
“`

元記事を表示

[Rails・Heroku]HerokuでWheneverが機能しない場合の対処

### 前提
記事を書いている私は現役のエンジニアではなくエンジニアを目指して学習中の者です。
よって、気をつけてはいますが記述内容には誤った内容が含まれている危険性があります。
その為この記事は参考程度に読んで頂き詳しい内容は公式の記述を参考にすることをおすすめします。

### この記事で実装すること
個人開発のアプリで**gem:whenever**を使用して定期処理を実行しようとしたが動作しなくて困ったのでその時の対処をまとめました。
具体的にはHerokuでは**gem:whenever**はサポートされていないらしいのでHerokuのアドオンである**scheduler**を使用して定期処理を実行させるように変更しました。

### 使用技術
Ruby 3.1.2
Rails 6.1.6
Heroku

### 実装手順
##### 1, 定期実行させたい処理をrakeタスクとして作成する
gemのwheneverでもHerokuのschedulerでもまずは実行するrakeタスクを作成する必要があります。
rakeタスクは以下のコマンドを実行することで作成できます。
t

元記事を表示

OTHERカテゴリの最新記事