Rails関連のことを調べてみた2021年03月01日

Rails関連のことを調べてみた2021年03月01日

【Rails】acts_as_listで並べ替え機能を実装

## 導入
“`rb:Gemfile
gem ‘acts_as_list’
“`
“`bash
$ bundle install
“`
“`rb:app/models/task.rb
class Task < ApplicationRecord acts_as_list end ``` ```bash rails g migration AddPositionToTask position:integer ``` ```rb class AddPositionToTask < ActiveRecord::Migration[6.0] def change add_column :tasks, :position, :integer #カラム名はpositionじゃなきゃいけない end end ``` ```bash $ rails db:migrate ``` ```config/routes.rb resources :tasks do member do get :move_higher get :move_lower end

元記事を表示

RailsでCustom Validatorの実装例

## 最初に
みなさん、Custom Validator使ってますか?

[rails guide](https://railsguides.jp/active_record_validations.html)の[ここ](https://railsguides.jp/active_record_validations.html#カスタムバリデーションを実行する)にも記載されていますが`ActiveModel::Validator`や`ActiveModel::EachValidator`を使って自作のvalidatorを作成することができます。

異なるmodelで同じようなvalidationを実行する場合は以下のようなメリットがあるので是非使っていきましょう。
・modelのコードを減らせる
・specの行数を減らせる
(Validator Classへspecを書けば良いので同じようなspecを減らせます)

## 実装例
よくあるパターンだと思うのですが異なるmodelでメールアドレスカラムを持っており、同じようなvalidationを実装する場合の実装例を記載します。

元記事を表示

Railsでお気に入り機能を実装する

##自己紹介
9月から独学でプログラミング学習を開始し、
11月からスクールを使って学習をしています。
現在はポートフォリオの作成し転職活動中です。
知識を定着させるために、学びをアウトプットしています。
また、これから学び始める方の参考になることを願っています。
***
##開発環境
– Ruby 3.0
– Ruby on Rails 6.0.3.4

#お気に入り機能を実装する

今回は**socialization**というgemを使用します。
>▼詳しくは公式のGithubはご覧ください。
https://github.com/cmer/socialization

現在、**User**テーブルと映画情報を保存する**Movie**テーブルがあるとします。
まずは、`Gemfile`に下記を追加します。

“`
gem ‘socialization’
“`

追加したら、`bundle install`を実行し、gemを追加してください。

次に、`rails generate socialization -s`を実行します。
実行すると、`like.rb` `fol

元記事を表示

Rails PK FK ってなんじゃ?

##テーブル定義でいきなりPK・FKが。。
今回、課題として「このようなテーブルを作成してください」ということで出てきたPK・FK.

##結論
PK = primary_key
FK = foreign_key

のことでした。
ただ、このFKは過去にいわゆる外部キーとして出会ったことがあったものの、PKって何?となり申した。

結論、主キーのことでした。
これは、テーブルを作成した時必ず出てくるidがまさにそれでした。
ただ、これを変える方法もあるんだとか。。

参考資料

今回の課題ではそのままidのことでしたのでそのままやっていきます。

しかし、なんでも略されるとわけわからなくなる時ありますよね。
・・・まじ最初サッカーやんって⚽️。

元記事を表示

[rails6] fullcalendar 攻略ガイド(予定追加、予定表示編)

# はじめに

この記事はjqueryの外部ライブラリである「fullcalendar」をrailsで使いこなそうという記事です。

前回の投稿をまだご覧になっていない方は下記の記事を一度ご覧になってからこちらの記事を読まれることをお勧めします。

### 過去の投稿

・ [[rails6] fullcalendar 攻略ガイド(導入、表示編)](https://qiita.com/rakko1124/items/faa93cb7e81e312b9ae3)

# 今回の内容の概要

今回は前回表示させたカレンダーの上に実際の予定を追加し、表示を実装してみたいと思います。

jqueryでajaxを使用するのでajaxの知識が必要になります。

### 前提知識

ajax,jbuilderの知識

### 参考

[Railsでajaxを実装する。基本の構造から、controller・jbuilderの書き方など。[Rails]](https://qiita.com/tanutanu/items/239abfe88bbbeec772bf)

#予定の追加

##実装の流れ

まず最初

元記事を表示

DockerでRails開発時に,画像の保存先をAWS S3にする

先日,Rails, Dockerでの開発時に画像の保存先をローカルからS3に変更した際の手順を記録した.

## 開発環境
WSL2 (ubuntu 18.04 LTS)
Docker
– Ruby (2.7.1)
– Rails (6.0.3)

## 画像をS3に保存する手順

Active Storageがインストールされており,S3バケット作成まで完了していることを想定

Active Storageのインストールは以下のコマンドでできる

“`sh:terminal
docker-compose run コンテナ名 rails active_storage:install
docker-compose run コンテナ名 rails db:migrate
“`

#### 用意するもの

– S3バケット情報
– バケット名
– リージョン

– IAMユーザー情報
– アクセスキー
– シークレットアクセスキー

#### 手順
##### 1. root dirにて以下のコマンドを実行

“`sh:terminal
docker exec –

元記事を表示

【Rails】関連先のデータを、中間テーブルで絞り込む。

# 目的
多対多のアソシエーションを組んでいて、関連テーブルのデータもincludeなどで取得するとき、
関連テーブル先のデータを中間テーブルのデータで絞り込む方法です。

# 前提
`患者: patient`が`医師: physician`との`診察予約: appointment`をとります。
診察予約が中間テーブルになります。
[Railsガイド](https://railsguides.jp/association_basics.html#has-many-through%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91)を参考にしました。

## migrate

“`db/migrate/xxxxxxxxxxxxxx_create_physicians.rb
# 医師
class CreatePhysicians < ActiveRecord::Migration[6.1] def change create_table :physicians do |t| t.string :name

元記事を表示

Association ; 1対1、1対多、多対多について

## Association
Rails には関連 (Association) という仕組みがある。関連付けを用いて二つのモデルをつなぐことで、コードをシンプル、かつ簡単に書くことができる。
関連付けの関係は大きく分けて以下の三種類に分類される。

* 1 対 1
* 1 対 多
* 多 対 多

### 1 対 1 (has_one, belongs_to)
例えば、Teacher, Class, Student, Subject のモデルで以下の図のような関係性があったとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070052/fda4c427-5edf-6c91-1233-bd196f7fcd53.png)

まずはTeacherとClassの関係性を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070052/485e581d-9385-565d-d50

元記事を表示

【Rails】 Deviseを複数導入する場合

はじめに

deviseを導入すると、簡単に認証機能が実装できて本当に便利なgemですよね!
Ruby on Railsを学び始めて2ヶ月目の頃、ユーザーと管理者に分けてdevise機能を2つ実装したい、こういった時はどうしたら良いのか、また複数のdevise間で両者とも使用するモデルに関してはどうしたら良いのか、と少し悩んだことがありましたので、今回の記事のテーマに選定致しました。

前提

今回説明するモデルを以下の三点に絞らせて頂いております。
● devise User
● devise Admin
● 両者に共通してItemモデルを使用

開発環境

ruby 2.6.3
Rails 5.2.4.4

gemを導入

“`Gemfile.
gem ‘devise’
“`
“`terminal.
$ bundle install
“`

ユーザー用、管理者用のdevise機能実装

deviseを複数実装することは意外と簡単です!
User、Adminのように適宜名前を付け、各コマンドを実行すればモ

元記事を表示

railsのgem「pagy」を使ってページネーション

#私がページネーションにpagyを選んだ理由
下記のリンクにて、メモリの負荷がwill-paginateやkaminariより軽いらしいとのことです。

Rails:「Pagy」gemでRailsアプリを高速ページネーション(翻訳)

記事の中に以下のグラフを見つけました。ページ数と使用メモリ数の関係をグラフ化したものですが、Pagyが圧倒的です。こりゃPagyを選びますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933066/f0cdaedb-4872-1087-6611-6eb512eec6fa.png)

#railsのgem「pagy」を使ってページネーション
以下の記事を参考にしたら初学者の私でも10分でページネーションできました。

2番目の記事が私的におすすめです。githubにもソースコードが上がっているので。

https://qiita.com/junara/items/eb85559547f87c8cb6b3

https

元記事を表示

【Ruby on Rails】before_actionを使って全てのアクションで同じ処理を行う

# 同じ処理をbefore_actionで定義する。

あるコントローラー内の全てのアクションで1つの処理を使い回したい時。

“`.rb
class Api::V1::Admin::CompanyAdminsController < ApplicationController def index company_admins = CompanyAdmin.where(company_id: params[:company_id]) json_response(200, CompanyAdminIndexSerializer.new(company_admins).to_h) end def show company_admin = CompanyAdmin.find params[:id] json_response(:ok, serialize_data(CompanyAdminIndexSerializer, company_admin)) end def destroy company_admin = Com

元記事を表示

【Railsチュートリアル】第10章 ユーザーの更新・表示・削除②

# 10.3 すべてのユーザーを表示する
`index`アクションを追加して、すべてのユーザーを一覧表示する。データベースにサンプルデータを追加する方法や、将来ユーザー数が膨大になってもindexページを問題なく表示できるようにするためのユーザー出力のページネーション(pagination=ページ分割)の方法を学ぶ。

## 10.3.1 ユーザーの一覧ページ
ユーザーのindexページはログインしたユーザーにしか見せないようにし、未登録のユーザーがデフォルトで表示できるページを制限する。

indexアクションが正しくリダイレクトするか検証するテストを書く。

“`ruby:test/controllers/users_controller_test.rb
require ‘test_helper’

class UsersControllerTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) @other_user = users(:archer)

元記事を表示

一覧表示での進捗率ゲージの作成

# はじめに
オリジナルアプリでクラウドファンディングサイトを作成した際に、
jQueryを使って進捗率ゲージを作成したので紹介します。
前回、詳細画面での作成方法を紹介しましたが
今回は一覧表示画面での作成方法です。

[![Image from Gyazo](https://i.gyazo.com/9d48b4ecd07f0773ae0f8649277a7115.jpg)](https://gyazo.com/9d48b4ecd07f0773ae0f8649277a7115)

詳細画面での作成はこちら→
https://qiita.com/takiguchiharuna1221/items/df517f2a9e4b74299328#comment-bd0d8efa2c7c3dc7651e
※こちらではlinear-gradientを使った別の方法も投稿していただいています。

初学者なのでより良い方法が他にもあるかもしれませんが、どなたかの参考になれば嬉しいです。

# 環境
・Rails 6.0.0
・Ruby 2.6.5
・jQuery

# 作成手順
【view】

“`

元記事を表示

RSpec:モデルの単体テストの記述例

今回は前回の記事「[RSpecの導入&関係の深いgemについて](https://qiita.com/yamaday0u/items/c3bf6036e11298771a99)」の続きで、モデルの単体テストを行います。

前回の記事の各gemのインストール、初期設定が完了していることを前提としています。

##モデルのテストファイルを作成
ターミナルで`rails g rspec model モデル名`コマンドを入力してテストファイルを生成します。

“`zsh:ターミナル
$ rails g rspec model モデル名
#以下のように表示されればテストファイルの生成が成功しています。
Running via Spring preloader in process 1234
create spec/models/モデル名_spec.rb
invoke factory_bot
create spec/factories/モデル名の複数形.rb
“`

たとえばuserモデルのテストファイルを生成するとこうなります。

“`zsh:

元記事を表示

[解決] Railsの言語設定エラー ’translation missing: ja.datetime.distance_in_words.x_days ago’ 

## 現状確認

ruby 2.6.6
Rails 6.1.0

インスタンス変数は、正しく定義されている。

“`ruby
[1] pry(#<#>)> @post.created_at
=> Sun, 31 Jan 2021 08:28:26.434149000 UTC +00:00
[2] pry(#<#>)> time_ago_in_words(@post.created_at)
=> “translation missing: ja.datetime.distance_in_words.x_days”
“`

ファイルを見ると、日本語になっている(自分がen→jaに変えたことに気づいていなかった)

“`ruby:application.rb
config.i18n.default_locale = :ja
“`

## 解決

今までtime_ago_in_wordsは英語設定だったから、上記の日本語変更でエラーが起きたっぽい

time_ago_in_words

元記事を表示

heroku pg:reset DATABASEでのエラー?

Railsチュートリアルを進めていたところ以下の流れでDBをリセットする必要があったので手順通り進めていたところ警告が出ました

“`
$ git push heroku
$ heroku pg:reset DATABASE
$ heroku run rails db:migrate
$ heroku run rails db:seed
“`
警告が出たのはこのDBのリセットコマンドを実行した時
“`heroku pg:reset DATABASE
“`

警告
![スクリーンショット 2021-02-27 11.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641519/146b7385-b270-54af-03cc-1d537155ac4a.png)

何かと思ったら、リセットしていいのか確認してるだけでした。

“`
roccky-bastion-3336
“`
画面の指示に従い上記コマンドを入力してリセット完了しました。

元記事を表示

renderにおけるlocalsとcollectionについて

localsとcollectionのオプションについての理解を深めようとこの記事を書くことにしました。
##1.localsについて

仮にposts_controllersに以下の記述があるとして

“`posts_controllers.rb
def show
@post = Post.find(params[:id)
end
“`

“`posts/foobar.html.erb
<%= render partial: 'post_partial', locals: { post: @post } %>

または省略形で
<%= rendner 'post_partial', post: @post %>
“`

“`posts/_post_partila.html.erb
<%= post.title%>
<%= post.body %>
“`

“`公式
公式(省略形)
<%= render 'パーシャル名', ローカル変数: インスタンス変数名 %>
“`

つまりlocalsオプションを使用することで
@postというインスタンス変数をpostという

元記事を表示

Railsのenumの可読性をあげる

## はじめに
Rails(ActiveRecord)でenumを扱おうとすると、db上のデータはintegerとして扱うことが多いと思います。
しかしこれだとdb上のデータが何を意味しているかわかりづらく、可読性が下がります。
そこで今回はMySQLを使うことを前提に、MySQLのENUM型を定義する方法をメモしておこうと思います。

## 環境
ruby 3.0.0
rails 6.1.1
MySQL 5.7

## 手順
“`ruby
class CreateAnimals < ActiveRecord::Migration[6.1] def change create_table :animals do |t| t.string :name t.column :animal_type, "ENUM('dog', 'cat', 'bird')", null: false t.timestamps end end end ``` ` t.column :animal_type, "ENUM('dog', 'cat',

元記事を表示

Railsでリンクを押すとなぜかcssが適用されてしまう??

## 概要
現在Railsでアプリを作成しているのですが、
Vue.jsを導入してから、リンクを押すとcssのスタイルが適用されてしまうバグが起きるようになりました。

## 試したこと
HTML,CSS,Vue.jsを少しずつ削って、どこが原因か探る作業を行いました。
(めちゃくちゃ時間かかった、、、)

結局解決できず。

## 解決策
application.jsのTurbolinksを無効化することで解決しました。

“`application.js
// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You’re encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that co

元記事を表示

Railsのdeviseを使用して複数のログイン画面を実装する方法

## deviseとは
Railsのgem(ライブラリ)の1つ。
ログイン機能の実装を簡単にしてくれるgemです。
これからdeviseを使用して複数のログイン画面を実装していきます。
## インストール・準備
Gemfileに追記

“`rails:Gemfile
gem ‘devise’
“`

bundleまたはbundle install実行

“`
$ bundle install
“`

deviseを使用できるようにインストールします。

“`
$ rails g devise:install
“`

上記のコマンドを実行すると、ターミナルに下記の文字が表示されます。

“`
===============================================================================

Depending on your application’s configuration some manual setup may be required:

1. Ensure you have defined de

元記事を表示

OTHERカテゴリの最新記事