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

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

【Rails】カラム名と異なるアソシエーションを設定する(belongs_to等のforeign_keyオプション)

## はじめに
STIであるモデルが絡んだ場合など、たまにタイトルのようにカラム名と異なるアソシエーションを設定したくなる場合がある。その方法について記録する。

## 結論
例えば、`ユーザ(User)一人一人に対し、複数の著書(Book)が属している`ような場合に、`その著書(Book)から、ユーザ(User)を取得する関連を「author(著者)」`としたい場合には、

“`
class User < ApplicationRecord has_many :books end ``` ``` class Book < ApplicationRecord belongs_to :author, class_name: "User", foreign_key: "user_id" end ``` と、`foreign_key: "user_id"`でカラム名を指定する。 ### 詳細 `foreign_key`でカラム名を指定しない場合、デフォルトではアソシエーション名に`_id`が追加されたカラムが参照される。 今回の例だと、Bookテーブルの`author_

元記事を表示

Railsにjavascriptを導入する

### javascriptを導入
RailsではWebアプリケーション開発が可能です。私も自身でポートフォリオを作りましたが、どうにも寂しい印象がぬぐえませんでした。というのも普段利用しているサービスを見ると、要素に動き、つまりアニメーションがあるものが多いです。マウスを合わせることでイラストが動いたり、文字が下から上からスライドして現れたりといったような感じです。
今のポートフォリオはページをリンクでただつなげたようなものなので、改善したい。
そこで扱うのがjavascriptです。これをRailsに導入します。
まずは、ファイルの作成。importでよびだすためです。
`script.js`ファイルを作成します。それをapp/javascript/packs/application.jsに記述しましょう。
“`
import Rails from “@rails/ujs”
import Turbolinks from “turbolinks”
import * as ActiveStorage from “@rails/activestorage”
import “channe

元記事を表示

【Rails】学生エンジニアの個人開発日記#01

自己紹介

はじめまして、こっしーです!!

これから初めてWebアプリを開発していくので、その進捗や得られた学びなどを記録していきます。

文章を書くスピードが遅いので、不定期な投稿になると思いますが、よろしくお願いします。

プログラミングへの興味・経験

大学入学当初からプログラミングに興味を持っていました。

大学1年生のときは、Pytonで簡単な処理を実行できるプログラムを書いて楽しんでいたり、大学2年生の時には、自身が所属する大学の大学祭のHP(現在は非公開)を作成していたりする時期がありました。

本格的かつ継続的にプログラミングを学び始めたのは、2022年の2月からになります。

学習を始めた最初の2か月は、Progateで学習をすすめ、Javascript、Ruby、Ruby on Rails、コマンドラインなどのコースを2周ほどしました。

現在は『Railsチュートリアル』で学習を継続しながら、作りたいサービスのコンセプトを固めたり、画面設計

元記事を表示

scopeとクラスメソッドの戻り値の違い

「とある条件に見合う最初のデータを取ってきたい」としたときにクラスメソッドとscopeでは戻り値に違いがある。ということがわかったので今後の使い分けの参考に。

## そのときやりたかったこと

ページに単純な定型文を表示させる機能を作った時のこと。条件としては、

– 本文がある(これを表示させる)
– 公開状況をON・OFFしてONのものを表示させる
– 公開状況がONであるデータが複数あったときにも一つだけが表示されるよう更新日時が一番新しいものを表示させるようにする

というもの。

それをページに表示させるため複数のデータの中から条件に合うデータを一つだけ持ってくるコードをそのモデルの中に書くことに。view側は単純で

“`ruby
– if @announcement.present?
= @anouncement.body
“`

とし、そのデータがあるようであれば表示するという条件のみ。

## scopeを使う

まず最初に使ったのがscope。書き方としては、

“`ruby
scope :published_latest, -> { where(pub

元記事を表示

An account already exists with the same email address but different sign-in credentials.

# 背景
Google firebaseのSNS認証で、同じemailアドレスを登録しているプロバイダで認証したところ
(例えば、FacebookアカウントとGoogleアカウントのメールアドレスが同じ場合など)

An account already exists with the same email address but different sign-in credentials…
のエラーメッセージと共にログインできなくなってしまいました…💦

# 改善策

Google Firebase様の公式ドキュメントの通りにjavascriptを書けばよさそうです!!

https://firebase.google.com/docs/auth/web/account-linking

元記事を表示

Webpacker::Manifest::MissingEntryErrorを解決した話。(Mac ローカルでrails serverの起動編)

# 環境
OS: Mac
SHELL: zsh

# Webpacker::Manifest::MissingEntryErrorが出たぞ〜!
ローカル環境で初めてrails serverを実行したら以下のエラーが発生した。
“`
ActionView::Template::Error (Webpacker can’t find application.js in /Users/hogehoge/environment/sample_app/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacke

元記事を表示

rakeタスクでテーブルを作成する

## 初めに
テーブルの不整合が発生していてmigrationでは対応しづらい時とかに使える。

## 実装
rakeタスクでmigrationのクラスを実装して呼び出せばOK。
テーブル作成以外にもカラム追加やテーブル削除など普段migrationで行なっていることは全てできる。

“`rb
namespace :hoge do
task execute: :environment do
CreateUsers.execute
end

# Migration[6.1]の[]内はアプリのRDBMSのバーションに合わせる
class CreateUsers < ActiveRecord::Migration[6.1] def self.execute create_table :users do |t| t.string :first_name, null: false t.string :last_name, null: false t.timestamps end e

元記事を表示

test時にActiveRecord::DatabaseAlreadyExists: Text file busyが発生!!

## はじめに
Ruby on Railsでアプリを開発中にテストを行うと、下記のエラーが発生しました(提案されたコマンド`db:test:load => db:test:purge`を入力しても解決せず)。

“`ruby:terminal
$ rails t
rake aborted!
ActiveRecord::DatabaseAlreadyExists: Text file busy @ apply2files – /home/vagrant/workspace/railstutorial6_sample/db/test.sqlite3
-e:1:in `

Caused by:
Errno::ETXTBSY: Text file busy @ apply2files – /home/vagrant/workspace/railstutorial6_sample/db/test.sqlite3
-e:1:in `


Tasks: TOP => db:test:load => db:test:purge
(See full trace by runni

元記事を表示

Rails 検索ツイートを直接表示させる

# 概要

ツイート検索機能に加えて検索ツイートを以下のように直接表示させる
※クリック時に該当ツイートに直接飛ぶようにする。

![取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294345/d7237449-a629-9c88-8c3e-131f0b0b94b6.png)

Rails5.2.8使用

# 事前準備

・Twitter APIを取得(省略)

以下などを参考にしてください

https://wporz.com/twitterapi-apikey-accesstoken/

・Gemfileに必要な記述を追加

環境変数記述用に以下を
“`
gem ‘dotenv-rails’
“`
twitterAPI使用のために以下を
“`
gem ‘twitter’
“`
“`
bundle install
“`
“`.env
TWITTER_API_KEY=取得したキーを入れてください
TWITTER_API_SECRET_KEY=取得したキーを入れてください
TWIT

元記事を表示

Unknown alias: default (Psych::BadAlias)でRailsが立ち上がらないとき

Rails6以降の立ち上げで`rails s`をしたとき

こんな感じで立ち上がらなかった
“`
hogehoge sample_app4 % rails s
=> Booting Puma
=> Rails 7.0.3 application starting in development
=> Run `bin/rails server –help` for more startup options
Exiting
/Users/hogehoge/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/to_ruby.rb:430:in `visit_Psych_Nodes_Alias’: Unknown alias: default (Psych::BadAlias)
from /Users/hogehoge/.rbenv/versions/3.1.1/lib/ruby/3.1.0/psych/visitors/visitor.rb:30:in `visit’
from /Users/hogeh

元記事を表示

文章の改行を反映してくれるsimple_format

通常、フォームのテキストエリアに文章を入力する際、改行を入れて入力したとしてもページに表示するときに何もしなければ改行が無視される。そのときに使えるのが「simple_format」という機能。
## 使い方
データを作成する際は通常どうりに改行を入れて作成すれば良い。
「simple_format」の出番は表示するとき
通常のテキストをそのまま表示する場合
“`
= @task.body
“`
と書くところ
“`
= simple_form @task.body
“`
とすればOK。これで作成時の改行が反映される。
## hオプションをつける
ユーザーが作成した文字列をそのまま表示する際は危険なscriptタグを入力され、XSSの危険があるため「hオプション」をつけて表示するのが良い。
“`
= simple_format(h(@task.body))
“`
これで危険なタグを文字列にエスケープすることができる。

元記事を表示

Tailwind CSS for RailsがDockerコンテナ内で反映されないときの対処法。purge設定に”html.erb”を含めていないことが原因

Tailwind CSS for Railsがローカルの開発環境では動いていたのに、Dockerコンテナ内で突然反映されなくなるという現象に遭遇しました。

まず、よくある原因は次の通りです。

## よくある原因
tailwind.config.jsのpurge設定が正しくない。

“`
# ディレクトリ構造(Dockerコンテナ内)
/var/www
└── myapp # Rails
├── app
│ ├── …
│ ├── …
│ └── views
├── …
├── config
│ ├── …
│ ├── tailwind.config.js
│ └── …
├── …
└── …
“`

“`myapp/config/tailwind.config.js
module.exports = {
con

元記事を表示

【Rails】APIモードでhelper_methodが使えない時の解決方法

# 今回の問題
RailsのAPIモードで個人開発をしている時にhelper_methodを使ってとあるメソッドを使いまわしたいと思ったのですが、うまくできず、苦戦しました。。
そんな時にとあるコードを書いただけで解決できたので今回はその解決方法について書いていきます!
以下の英語の記事を参考にしました。
[undefined method `helper_method’ for ApplicationController, Rails 5](https://stackoverflow.com/questions/39171741/undefined-method-helper-method-for-applicationcontroller-rails-5)

**詰まったコード**
“`Ruby
class ApplicationController < ActionController::API helper_method :login!, :current_user def login! session[:user_id] = @user.i

元記事を表示

🔰【初学者用】kaminariを使ってページネーションを実装しよう!【Ruby on Rails】

# はじめに
現在Ruby on Railsでオリジナルアプリを作成しています。
その際にGemの`kaminari`を使ってページネーションを実装しました。
ページネーションはとても簡単です!是非実装の参考にしてください!
Googleでなにかしらを検索したときに下の画像のようなページ遷移の番号がでてきますよね。これがページネーションです!
ページネーションの参考画像↓

https://gyazo.com/5039e4f4574713dc5cbdc396e3dd0332

# kaminari導入
ますはページネーションの実装を簡単にする`gem’kaminari’`を導入しましょう!
“`rails:Gemfile
gem ‘kaminari’
“`
記述を終えたらターミナルにて
“`rails:ターミナル
bundle install
“`
を行います。
# コントローラーの記述
“`rails:controller.rb
def index
@users = User.page(params[:page]).per(15)
end
“`
コントローラーの選択は

元記事を表示

Railsの「schema.rb」の日時表記とRuboCop設定

先日、RuboCop先生がRailsのschemaファイルに対し、
ナンセンスな自動修正をしてきたので、その対処を備忘録として残す。

## Railsの「schema.rb」のバージョン日時表記
Railsのデータベース管理の要とも言える「schema.rb」ファイルには、
下記のように「**YYYY_MM_DD_hhmmss**」形式でバージョン日時が記載されている。
“`ruby:schema.rb
ActiveRecord::Schema.define(version: 2022_05_24_023952)
“`
この表記、残念ながら初期設定の**RuboCop先生の逆鱗**に触れてしまう。
## RuboCop先生のご指摘
![エラー発生中.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667968/65a3af92-5364-345a-b0b0-f147ab2f3bc2.png)

:::note alert
先生「たくさん数字が並んでるときは、
**3桁ごとに”_”で区切って**書い

元記事を表示

【Rails / devise】ユーザー編集機能の実装(「現在のパスワード入力」の設定を無くす方法)

## 初めに

##### このような方におすすめの記事です
・devise ユーザー編集の方法を知りたい
・デフォルトの「現在のパスワード」を入力せずにデータをアップデートしたい

## 前提

・deviseを導入済(インストール〜モデル作成まで)
・編集機能のレイアウトを作成済

以下の記事を参考に導入しています。

[Devise] パスワードを入力せずにユーザー情報を編集する
Deviseでパスワードの入力無しでユーザー情報の更新をする方法

## 手順

#### ①deviseのコントローラーを作成する

ターミナル
“`
rails generate devise:controllers users
“`

#### ②作成された以下のファイルに追記する

“`app/c

元記事を表示

Railsのトランザクション

# トランザクションとは
データの整合性を保証するための処理のこと。
途中で処理が失敗したらそれまで行った処理を元に戻す(ロールバック)。

例えば、銀行でAさんがBさんに1万円を送金するとする。
この場合、
①Aさんの口座から1万円を引く
②Bさんの口座に1万円を足す
という処理を行うが、もし②の処理が何らかの理由でエラーになった場合、トランザクションを使わなければ、Aさんがただ1万円を損しただけになってしまう。

トランザクションを使うと、②が失敗したら①の処理が元に戻るので最悪の事態は免れることができる。

# Railsのトランザクションの書き方
“ActiveRecord:Base.transaction“を使う。
“`:main_controller.rb
ActiveRecord::Base.transaction do
実行したい処理
end
“`

# トランザクションの注意点
例外が発生しないとロールバックは行われないことに注意する。
save!やupdate!など破壊メソッドの処理で失敗すると例外が起きる。

元記事を表示

railsで動的にclass/id名をつける

# 結論
クラス名に変数代入を使用する。

# 背景
DBからデータを取得して一つずつ表示する機能を実装していました。
動的に表示非表示を切り替える処理を実装するときにrailsのviewファイルに
“`

class=”section1″
class=”section2″
class=”section3″
class=”section4″

.
.
.

class=”section10″

“`
と記載して都度“`display:none“`で表示非表示を切り替えるというものでした。
# 何が悪なのか
railsの設計思想の一つにDRY(Don’t Repeat Yourself)があります。「コードを重複させない」という意味合いです。
可読性が下がる。コード量が増える意味合いでも極力コードの重複は減らさなければなりません。

# 具体例
今回はDBから取得したデータを一つずつ表示非表示するというものでした
“`
class=<%= "section#{questio

元記事を表示

railsアプリを作成 before_action

# 行うこと
・例外処理をする
・エラーメッセージを表示させる

# 例外処理を行う。
“`users_controller.rb
.
.
.
def login
@user = User.find_by email: params[:email], password: params[:password]
if @user
flash[:notice] = “ログインに成功しました。”
redirect_to “/users/#{@user.id}”
else
render “login_form”
end
end
.
.
.
def create
@user = User.new(name: params[:name],email: params[:email],
password: params[:password])
if @user.save
flash[:notice] = “新規作成に成功しました。”
redirec

元記事を表示

railsのアプリを作成 バリデーション、フラッシュメッセージ

# User関係の処理出忘れていたところ
ユーザーの新規登録、ログイン、一覧、詳細ページ、または機能を追加できた。
しかしまだなくなっているものがある。
プロゲートを参考にしている。
それは
・バリデーションをかける
・フラッシュメッセージをつける
・例外処理をする
・エラーメッセージを表示させる

・ユーザー画像を設定する
・session[:user_id]を使いログイン中にさせる。
・条件分岐で表示内容を変える

まずuserモデルのバリデーションをかけよう。

## バリデーションをかける
“`user.rb
class User < ApplicationRecord validate :name, {presence: true} end ``` こんな感じかな? 見てみよう。 ```user.rb class User < ApplicationRecord validates :name, {presence: true} validates :email, {presence: true, uniqueness:true} validates :p

元記事を表示

OTHERカテゴリの最新記事