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

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

アクティブストレージを利用して複数枚の画像を投稿した際の単体テスト

アクティブストレージを利用して複数枚の画像投稿には成功した。
しかしテストコードで詰まったので記録。
結論
“`ruby
RSpec.describe Item, type: :model do
before do
@item = FactoryBot.build(:item)
@item.images = [ fixture_file_upload(“/files/test_image.jpg”)]
end
“`
このように書き換える。
画像1枚のときは fixture_file_uploadだけでよかったのですが、複数枚になったことで配列で渡す必要があったのですね。

元記事を表示

エラーメッセージを日本語対応にする

フリマアプリ追加実装にてエラーメッセージを日本語対応にしたので記録。
まずは
config/application.rb
“`ruby
config.i18n.default_locale = :ja
“`
を追記。これしないとエラーでます。

“`ruby
gem ‘rails-i18n’
“`
をgemファイル末尾に加えてbundle install(ローカル)
itemモデルのimageのところを
“`ruby
has_many_attached :images
“`
このようにhas_many_attachedに変える。image→imagesの複数形にすることも注意。
次にitemsコントローラー。
ストロングパラメーターを書き換える。
“`ruby
def item_params
params.require(:item).permit(:product_name,:product_description,:category_id,:condition_id,:contribution_id,:prefecture_id,:delivery_id,

元記事を表示

Firebase Authentication を試してみた~フロントエンド編~

## 環境
– Firebase
プロジェクトを登録して Google、GitHub の Authentication を設定済み

– 言語、フレームワーク
TypeScript、Next.js、React、graphql、React MUI

## Firebaseの設定
ここから、firebaseConfig を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91978/2b30461b-2ea4-c91e-5471-a2d311b7d69d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91978/eeef9a7a-5318-5b8c-1218-4f9e1480e646.png)
APIKeyなどは 環境変数に設定しなくても大丈夫なの? とも思ったんですが、どうやら大丈夫な模様。

https://qiita.com/hoshymo/items/e9c14ed

元記事を表示

ブロック、コールバックの使い方の一例

>どうもaono1234と申します。記事がいいなと思ったらtwitterのフォローもお待ちしております‼

皆さん、ブロック(コールバックメソッド)は使用されてますでしょうか?
自分は今日まで使ったことがありませんでした。?

どうも使いどころが分からないんですよね~
しかし、やっと使いどころが1つ明らかになりましたので共有させて頂きます。

## はじめに
本記事は以下の読者様が対象です。

* プログラミング初心者

* コールバックメソッド(ブロック)について知りたい

本記事ではRubyを題材に例題コードを作成しているため、コールバックではなくブロックと呼称させて頂きます。

## 先に結論
* ブロックを使うことで複数のメソッドをつなぎ合わせることができる。
* メソッドを拡張する際によりブロックを使えば、抽象的な名前に変更しなくてよくなる。

## 背景
私はオリジナルのスクレイピングコードを書いており、
以下のような自作メソッドを定義しておりました。

このメソッドはスクレイ

Railsガイドの「記事を削除する」で削除できなかった話

## はじめに
RailsガイドでRails入門中にはまったので誰かの助けになればと思い書いた。

## 問題
[Railsをはじめよう – Railsガイド](https://railsguides.jp/getting_started.html)でRailsに入門しているが、「7.5 記事を削除する」でうまく動かなくなった。
Destroyのリンクを押しても確認も出ずリロードされるだけで削除されない。
コードは以下である。
“`ruby
<%= link_to "Destroy", article_path(@article), data: { turbo_method: :delete, turbo_confirm: "Are you sure?" } %>

# https://railsguides.jp/getting_started.html 「7.5 記事を削除する」より
“`
開発用サーバ(bin/rails server)から出ているログやWebブラウザのネットワークやコンソールを見ても特にエラーは見当たらなかった。

## 環境
– OS: Ubuntu 22

本番環境(EC2)上でunicornが起動できない時に確認すべきこと

# 概要
下記記事を参考に、RailsアプリをAWS上で動かす設定をしていたが、unicornの起動から色々とハマった。
その際の解決方法について。

https://qiita.com/gyu_outputs/items/b123ef229842d857ff39#%E3%83%A6%E3%83%8B%E3%82%B3%E3%83%BC%E3%83%B3%E3%82%92%E8%B5%B7%E5%8B%95

# 環境
– アプリ
– ruby 3.0.2
– rails 6.1.4
– mysql 8.0.31

– EC2AMI
– Amazon Linux2 AMI

## unicorn起動
“`terminal:ターミナル(EC2)
# xx-xx-xx-xxはパプリックIPアドレス
[ec2-user@ip-xx-xx-xx-xx ]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
“`

## エラー発生
“`terminal
master faile

[Ruby]関数を作成する上で心がけること

## ラベル付き引数

* 引数名がはっきりしているので渡す内容がわかりやすい。
* rubymineのIDEなどで自動保管してくれる
* 渡し忘れの引数があればエラーが出る
* デフォルト値も指定できるのでデフォルト値指定した分は省力できる
* 引数の順番気にしなくていい

“`
# 定義
def some_method(user: , require: false)
end

# 呼び出し型
some_method(
user: current_user
)
some_method(
user: current_user,
require: true
)
“`

## 普通の引数

* rubymineのIDEなどで引数名は把握できる
* 渡し忘れの引数があればエラーが出る
* デフォルト値も指定できるのでデフォルト値指定した分は省力できる
* 引数の順番を気にしなくてはいけないので数が多いと面倒
* 1・2個の引数でメソッド名からもわかりやすければ楽
* User.find(1) / User.find_by(id: 1) 左が楽

“`
def

Rails 7 で複数の CSS のエントリーポイントを使う方法(管理画面は本体とは別の CSS を使いたいときなど)

## 対象

npm パッケージの [sass](https://www.npmjs.com/package/sass) を使っている

:::note info
`rails new` 時に `–css` オプションで bootstrap や bulma, sass を指定した場合は npm パッケージの sass がインストールされています。
:::

## 結論

sass の Many-to-many Mode を使います。

https://sass-lang.com/documentation/cli/dart-sass#many-to-many-mode

具体的には `package.json` のスクリプトのうち、 sass で scss ファイルをコンパイルするコマンドの引数を変更します。

## 例 `application.bootstrap.scss` とは別に `admin.scss` を使いたい場合

`./app/assets/stylesheets/admin.scss:./app/assets/builds/admin.css` を追記します。

【Rails6】終了日のバリデーションはValidatorが使える

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## 状況
終了日が開始日より先にならないようにバリデーションをかけたい。
開始日は必須パラメータで、終了日はオプション。

## before

“`ruby
class Period
attr_reader :start_date, :end_date

def initialize(start_date, end_date)
@start_date = start_date
@end_date = end_date
end

def validate_finish_contract_date!
return nil if end_date.blank?

raise ActionController::BadRequest, ‘不正な終了日です’ if end_date.to_date < start_date.to_date end_date.to_date end end ``` ## after 別クラスに切り出さな

【エラー解決方法(Rails API)】 406 Not Acceptable,…is missing a template for this request format and variant

# 概要
Rails7とReactでjbuilderを使用して値を返した際に出力された406エラーを解決するための記事です。

### エラー内容
“` docker
api_1 | Completed 406 Not Acceptable in 24ms (ActiveRecord: 5.6ms | Allocations: 1086)
api_1 |
api_1 |
api_1 |
api_1 | ActionController::UnknownFormat (Api::V1::PostsController#index is missing a template for this request format and variant.
api_1 |
api_1 | request.formats: [“text/html”]
api_1 | request.variant: []):
api_1 |
“`
### ソースコード
“`posts_controller.rb
module Api
modu

Action Cable+ReactでWebSocketのアプリケーションを0から作る

RailsのAction CableとReactの組み合わせでWebSocketのアプリケーションを0から作ってローカルで動作させました。

この記事では下記のチャットアプリの作った手順を紹介します。
下記の動画では、上下のブラウザでwebsocketでチャットしています。

![ezgif-1-7afa5d7957.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/43644227-8722-339f-9a7b-c99478de698f.gif)

# 主要ライブラリなどのバージョン

フロントエンドはReact、バックエンドはRailsを使っています。
主要なライブラリのバージョンは下記の通り。

## バックエンド

| ライブラリ | バージョン |
|:———–|:———–:|
| Ruby | 3.1.2 |
| Rails | 7.0.4 |
| Redis | 7.0.5 |
| Re

【Rails】マイグレーションの変更内容の反映

# マイグレーションの状況の確認
db:migrateは、クエリを打ってデータベースを直接操作するようなことなく、migrationfileに記述された仕様の通りにデータベースのスキーマを設定できる処理のこと。
db:migrateが実行されると、migrationfileはそのバージョンに基づくIDにより管理されることになる。そのため、既存のmigrationfileの内容を変更して、再度db:migrateを実行しても、同じIDのmigrationfileによるマイグレーションが既に実行されている場合、変更内容は反映されない。

まず、現在のマイグレーションの状況を確認するため、以下のを実行する。
“`:terminal
$ rails db:migrate:status
“`
すると例えば以下のようなマイグレーションの状況が出力される。
“`
Status Migration ID Migration Name
————————————————–
up 20221016090215

[Rails]URLの先頭にhttp://をつけるカスタムバリデーション

## やりたいこと

最近バックエンド側の開発では適切なバリデーションをかけることがとても重要なことがわかりました。
今回は規格以外のデータを保存できないようにするバリデーションに加えて、
データが規格以外だったらデータを規格に合うように修正して保存するバリデーションの作成の簡単に紹介したいと思います。

## 不具合事例
今回の案件としては、お客さんの入力した外部URLの先頭に`http://`及び`https://`がついてない場合、link_toメソッドだと、サービス内のPathになってしまいます。
わかりやすくローカル環境の例で説明します。

`localhost:3000/posts`ページで`link_to “yahoo”, “www.yahoo.com”`にすると
`yahooのサイト`ではなく`localhost:3000/posts/www.yahoo.com`に飛びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350392/3f839508-b92d-d

[Rails]ルーティングのネストとは?

## 背景
Ruby on Rails にてアプリ作成の復習中に躓きましたので
こちらに備忘録として投稿いたします。

## ルーティングのネストとは?
あるコントローラーのルーティングの中に、別のコントローラーのルーティングを記述することです。

例えば、twitterのようなアプリがあったとします。
あるツイートに対して、たくさんのコメントがUPされますが、
どのツイートに対してのコメントかを判別する必要が出てきます。
それを実装するために、ルーティングをネストさせます。

## 具体的な記述の仕方
“`ruby
Rails.application.routes.draw do
resources :親となるコントローラー do
resources :子となるコントローラー
end
end
“`

“`ruby
resources :tweets do
resources :comments, only: :create
end
“`
このように記述することにより、どのツイートに対してのコメントかというルーティングが作成されます。
![ari.png

画像投稿機能を改善する(プレビュー機能をつけよう)

完成した某フリマアプリに画像投稿機能の改善をしました。
プレビュー機能と、実際に見た時に画像のサイズがバラバラだったので、画像サイズを統一できるように設定しました。
“`javascript
document.addEventListener(‘DOMContentLoaded’, function(){

const itemForm = document.getElementById(‘new_item’);

const previewList = document.getElementById(‘previews’);

if (!itemForm) return null;

const fileField = document.querySelector(‘input[type=”file”][name=”item[image]”]’);

fileField.addEventListener(‘change’, function(e){

const alreadyPreview = document.querySelector(‘

チェックボックスタグ機能の補足と、ページネーションを付けた場合のエラー解決

# はじめに
この記事はチェックボックスタグ機能を付けている前提で進めています。まだつけていない方は以下の記事を参考に、実装してみて下さい。
[【タグ機能完全版】 ~ Rails](https://qiita.com/MandoNarin/items/5a5610a40c66f77d6c10)

目次
1.補足(一覧ページに投稿したタグを表示する方法)
2.ページネーションを付けている場合のエラー解決

それでは、始めていきましょう。

# 1.補足(一覧ページに投稿したタグを表示する方法)
index.html.erb のeach文の中に以下の記述を追加してください。
“`erb:index.html.erb
<% @tweets.each do |t| %>
#以下を追記
<% t.tags.each do |tag| %>
<%= tag.name %>
<% end %>
#ここまで
<% end %>
“`
このように追加すれば、一覧ページに投稿したタグが表示されるはずです。もし表示されない場合やエラーが出る場合はアソシエーションやコントローラ

Capistranoを使って自動デプロイする

某フリマアプリを作成した際、AWSのEC2を利用して自動デプロイするとき、ものすごく手間がかかったので備忘録。
詰まったところをかいつまんで載せる。
まず
“`ruby
adapter: mysql2
database: (アプリ名)_production
username: root
password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
“`
をconfig/database.ymlに記載するわけですが、この記載場所は、
プロダクションのところに記述します。
例えば、
“`ruby
production:
<<: *default adapter: mysql2 database: furima-(番号)_production username: root password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
“`
といった感じに。

次につま

[Rails]dependent: :destroyオプションとは

## きっかけ
アプリ作成を復習中に???となりましたので、復習として、投稿します。

## dependent: :destroyオプションとは

dependentオプションとは親モデルを削除した時に、
親モデルと関連している子モデルに対する挙動を指定するオプションです。

<例>
1つのツイートに対して5つのコメントがあるとします。
そのツイートが削除されたら、それに付随する5つのコメントも削除されるべきです。

その場合、Tweetモデル(親モデル)に関連している
Commentモデル(子モデル)のdependentオプションに、:destroyを指定します。

## 実際のコード
モデルのアソシエーションに追記します
“`ruby
class Tweet < ApplicationRecord has_many :comments, dependent: :destroy end ``` 上記記述により、 tweetsテーブルのレコードが削除された場合、 関連しているcommentsテーブルのレコードも同時にdestroyメソッドが実行され、一緒に削除されます。

【Rails】content_forに関する学習メモ

## 学習背景

現職でよく`content_for`が記述されている箇所を見かけるものの、いまいちまだ理解しきれていなかったため、学習したメモを残します。

## content_forとは

content_forは個別のビューで表示させたい内容を表示するのに使用されます。 例えば、各ページでタブの内容を変えたい場合、railsアプリを作成した際のデフォルトだと、`application.html.erb`にtitleタグで 設定されているため、全ページ同じタブになってしまいます。

![application_html_erb_—_study_content.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673263/4abc8ee9-735e-caf1-9c24-7fcb6cb88d8c.png)

![StudyContent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673263/b1df7a97-42d

まずはTOPページを出してみよう〜CURD機能の説明を添えて〜

超初心者のための覚え書きです

まずはTOPページをブラウザに反映させるまでの手順をサクッと。
①コントローラーを作成
②アクションを定義
③ルーティング
④viewファイル作成
⑤サーバーを起動
⑥URLへアクセス

コントローラーを作成

“`
rails g controller homes
“`
コントローラーの名前は複数形で小文字で書くこと。
私はWebアプリ初作成の時、コントローラーを単数形で作成してエラー起こしました。
コントローラーは、ルーティングをもとに処理を実行して、対応する画面を表示させます。
画面に渡すデータ(インスタンス変数)を定義してくれます。

TOPアクション定義

作成したhomesコントローラーにTOPページを表示するための定義をしていきます。
“`ruby:controller/homes_controller.rb
class HomesController < ApplicationController def top end end ```

ルーティング