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

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

【Rails】部分テンプレート(render)で別のコントローラーのビューを呼び出す方法

#はじめに
違うファイルのビューを他のファイルのビューに表示さる際、部分的にそのビューをrenderで呼びだすことができます。
そんな、部分テンプレートの方法について紹介します。

###目次
1. 部分テンプレートファイルの名前について
2. renderで呼び出す
3. コントローラーへの定義

#開発環境
ruby 2.6.5
rails 6.0.0

#実装
それでは実装していきます〜

#1. 部分テンプレートファイルの名前について

まず、部分テンプレートとしてビューファイルを作成する時は`_index.html.erb`のようにファイル名の前に`_`(アンダースコア)をつけます。

![スクリーンショット 2020-11-23 5.40.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/c622d7d1-df74-6c5b-791b-23f5057e0ce3.png)

今回はproductsコントローラーのビューを部分テンプレートとして使いたいので、`products

元記事を表示

[Rails]ユーザー新規登録時にメールを自動配信する機能を実装する[備忘録]

#はじめに
先日、Ruby on Railsでアプリケーションを作成しました。
その中で、ユーザーに新規登録をしてもらうと同時に、ユーザーのメールアドレス宛にメールを送る機能を作りました。
ネットで調べつつ、試行錯誤しながら実装したのですが、色々な情報が入り乱れていて、少しだけ分かりにくかった印象があったので、備忘録も兼ねて、ここでまとめたいと思います。
それでは参りましょう!

#メール送信機能を記述

““ruby:config/environment/development.rb
#以下を追記
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_url_options = { :host => ‘localhost:3000’}
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:address => ‘smtp.gmail.com’,
:port

元記事を表示

Formオブジェクトについて

## Formオブジェクトとは?
 **1つのフォーム送信で複数のモデルを操作したい場合**や、テーブルに情報を保存しない情報に対するバリデーションを行いたい場合使うデザインパターンのこと。

## 実装手順
####① 新たにformオブジェクト用のmedelを作成する
“`ruby:ターミナル
% rails g model モデル名
“`

####② form_withメソッドに対する機能とバリデーションを行う機能を持たせる。
“`ruby:test_form.rb
class TestForm

include ActiveModel::Model
“`

◯ **include ActiveModel::Model**
 この記述のように、ActiveModel::Modelをincludeすることで、form_withやrenderなどのヘルパーメソッドの引数として扱えたり、バリデーションの機能が使用できるようになる。
 この記述は「**Formオブジェクト**」を呼ばれる。

####③ 保存したい複数のテーブルのカラム名全てを属性値として扱えるようにする。

元記事を表示

Mysql2::Error: Table ‘○○_production.users’ doesn’t existを解消した話

表題が発生し、解消するまでの顛末をまとめました。原因は2つありました。

# 開発環境
ruby 2.6.5
Rails 6.0.3.2
capistrano 3.14.1
AWS EC2
webサーバーNginx
アプリケーションサーバーUnicorn

# 事の発端
データベース関連の修正を行ったため、本番環境(EC2)で一度テーブルを落としてから再作成しました。
そしてマイグレーションを行った際、表題のエラーが発生しました。結論、原因は2つありました。

# 原因その1 userを参照するreferencesメソッドが、userテーブルが作成される前に読み込まれていた
こちらの方がわかりやすくまとめられてます。

rails db:migrate:statusで確認すると、確かにテーブルのステータスがdownになっていました。
タイトルの通り、エラーメッセージの指摘は何ら矛盾がありませんでしたね。
ただ、開発環境ではエラーにはならず?アプリも正常に動いていたので、気づくのに

元記事を表示

Rails 6.0~ DEPRECATION WARNINGが出力されないようにした。

rails6.0~から定数の読み込みにzeitwerkモードというものが使われるようになりました。
https://railsguides.jp/autoloading_and_reloading_constants.html
それに起因して、サーバーを起動した際に以下のようなwarningがログに出力されるようになりました。
このwarning邪魔なので消したいなあと思っていたところ、無事解決することができたので、同じことで困っている方たちのお役に立てれば良いなと思い、雑記します。

“`ruby
DEPRECATION WARNING: Initialization autoloaded the constants MyClass.
“`
結論から述べると、このwarningが出る原因は、initializersディレクトリ内で自分で定義した定数(MyClass)を読み込んでいたことでした。
initializersディレクトリ内での定数の読み込みはリロード時には行われない。そして、自分で定義した定数はリロード時に変更を反映できる方が開発の便宜上良いので、initializer

元記事を表示

ひな祭り[Ruby]

#ひな祭り[Ruby]問題
#問題
ひな祭りの準備をしましょう。あなたが持っている 10 体の人形を “A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J” で表します。ひな壇の各段 (計 3 段) に並べる人形の数が与えられるので、各段にならべる人形の記号を改行区切りで出力してください。人形は必ずもとの A, B, C, … の順番で並べます。

例)

各段にならべる人形の数: 2, 3, 5

→ 人形の並べ方:

AB
CDE
FGHIJ
#入力される値
入力は以下のフォーマットで与えられます。

h_1 h_2 h_3
ひな壇の 1 段目、2 段目、3 段目に並べる人形の数を表す整数 h_1, h_2, h_3 がこの順に半角スペース区切りで与えられます。入力は 1 行となり、末尾に改行が 1 つ入ります。
#期待する出力
ひな壇への人形の並べ方を以下の形式で出力してください。

s_1
s_2
s_3
ひな壇の 1 段目、2 段目、3 段目に並べる人形を表す文字列 s_1, s_2, s_3 をこの順に改行区切りで出力してくださ

元記事を表示

seedで初期データを生成するコードで使ったメソッド

#はじめに
 先日、投稿した「[初期データをseeds.rbに記述して、ゲストログイン機能のエラーを解決してみた](https://qiita.com/TerToEer_sho/items/497030d3acd60342da18)」でseeds.rbに初期データを作成したときに使ったいくつかのメソッドについて、説明する。

##基本の書き方
“`ruby:seeds.rb
モデル名.メソッド(カラム名: 値)
“`

###create!
基本は、これかと…
単純に、「作って!」というやつ。
同じidや一意性のバリデーションによってエラーになることもあるので、注意が必要。
###first_or_create_by!
中学英語みたいだが、`first`と`or`とつくので、
「id=1が存在しなければ、作るよ!」みないな意味。
つまり、初期データを作成する、ターミナルで`rails db:seed`を行う前に、データが存在すると、seed.rbで作成したデータは保存されない。

###find_or_create_by!
同じく中学英語みたい。
「テーブルになければ、作るよ!」み

元記事を表示

Active Storage の導入まとめ

###はじめに

・Active Strage の導入を自分なりにまとめたもので、メモのようなものです。
・投稿者は初学者ですので誤った情報を投稿してしまうことがあります。その時はぜひ、遠慮会釈なしにご指摘いただけると幸いです。

###Active Strageとは
ファイルアップロード機能を手軽に実装できるGemのこと。
元々はインストールが必要だったが、Rails5.2.0以降、初期段階から統合される事となった。このGemを用いると、ファイルアップロードのメソッドを使用できたり、画像を保存するテーブルを簡単に作成できる。

###Active Strageのお供
Active Strageと一緒に導入すると画像の加工の幅が広がる物を3つ列挙します。

・ImageMagick
・MiniMagick
・ImageProcessing

ImageMagickはソフトウェアで、MiniMagickとImageProcessingはGemになります。

`ImageMagick`
コマンドラインから画像に処理を加えることができるツールのこと。
画像の作成やサイズ変更、保存形式の変更な

元記事を表示

[Rails]オーバーライド(継承)について勉強してみた![初心者]

#オーバーライドとは?
親クラス(スーパークラス)で定義されたメソッドについて、小クラス(サブクラス)で同じ名前で再定義すること。

#クラスの継承とは?
他のクラスをベースとして新しいクラスを作成することをクラスの継承と言います。

利用したいクラスが複数存在する場合、全てを1から作成していると骨が折れますし、共通する部分を複数のクラスに重複して定義する必要があります。
そこで、あるクラスが既に作成されている場合、そのクラスを拡張することで、新しいクラスを作成することができます。

クラスの継承は以下のように記載します。

““ruby:
class 子クラス名 < 親クラス名 end ```` #継承の具体例 ````ruby: class Days def study puts "勉強する" end end class Holiday < Days def sleep puts "寝過ごす" end end holiday = Holiday.new holiday.study ```` ````ruby:実行結果 勉強する ````

元記事を表示

【Rails】いいね機能をjQueryで実装

## はじめに
一覧ページでのいいね機能を実装しようとしましたが、一番上の星をいいねしたら全てのチームにいいねがついてしまうという問題が発生しました。この問題が起きたことで大変学習になったので、思考の整理とアウトプットとして記事にまとめさせていただきました。また、いいね機能は多くのアプリで実装することが多いと思います。同じような問題が起きている方や別の実装方法など、ご意見いただけたら幸いです!

## 概要
まず大前提にテーブルは、`users`, `teams`, `likes`の3つで`likes`は
`users`と`teams`の中間テーブルになっています。
AjaxでHTTPメソッドの`GET`, `POST`, `DELETE`ができるように実装していきます。

## 起きている問題・解決したいこと(仮説)

起きている問題と解決したいことを簡単に書いていきたいと思います。

#### 起きている問題
– 全ての記事にいいねがついてしまう。
– 全てのチームのidを取得していたつもりが一番上のチームのidしか取得できていない。(デベロッパーツールで確認)

#### 解決し

元記事を表示

Rails 6用のJavaScriptをRails 5.2で使う

RailsアプリケーションでRailsをバージョンアップするときには、段階的に修正しては本番サーバーを更新、ということをやっています。

– JavaScriptの修正、パッケージの更新。
– 新しいRailsでwarningが出るところを修正。
– 最後にRailsをバージョンアップ。

といった感じです。ここでは、Rails 5.2を6.0に上げる準備として、Rails 6.0で導入されたJavaScriptのパッケージを5.2アプリケーションで使ってみます。

## コピペ元の6.0アプリケーションを作っておく

5.2と6.0のコードを比較したりコピペ元として使ったりするために、6.0アプリケーションを作成します。

“`zsh
% rails –version
Rails 6.0.3.4
% rails new foo –webpack=vue
“`

## JavaScriptパッケージの導入

Railsがデフォルトで使うJavaScriptは、6.0からはassetsからWebpackerに移されました。次の4つです。

– @rails/actioncable

元記事を表示

Rails API × GraphQL プロジェクトを作成する際にハマったこと

## 概要

以下の記事を参考にプロジェクトを作ろうとしたところ私のmac環境で次のような問題でハマったためまとめます。

– [【Rails】graphql-rubyでAPIを作成 – @k-penguin-sato](https://qiita.com/k-penguin-sato/items/07fef2f26fd6339e0e69)
– [Rails APIモードで始めるGraphQL – @dkawabata](https://qiita.com/dkawabata/items/4fd965ee6d7295386a8b)

## 環境

– macOS Mojave v10.14.6
– Rails 5.0.7.2

## `make: *** [mysql2.bundle] Error 1`

これはGraphQL関係なく、mysql2の `$ bundle install` エラーでした。

“`
$ bundle install

Fetching mysql2 0.5.3
Installing mysql2 0.5.3 with native extensi

元記事を表示

ActiveRecordでは present? の代わりに exists? を使おう

小ネタです。

# 条件に該当するレコードが存在するかを確認したい
ActiveRecordで条件に存在するレコードが存在するかを確認するのに、つい、

“`ruby
Model.where(conditions).present?
“`

と書いてしまいがちですが、これはパフォーマンス上の問題が生じる可能性があります。

`.present?` は ActiveSupport によってモンキーパッチされたメソッドです。
`Mode.where(conditions)` のような `ActiveRecord_Relation` クラスのオブジェクトに `.present?` を適用するとどうなるか?

すると条件に該当するレコードを**全てDBから取得して**、(Rails上のモデルの)配列として評価することになります。
配列に要素が存在すれば `true`、 しなければ `false` ですね。

## なぜこれはダメなのか
一見すると問題なさそうですし、実際結果自体は正しいのですが、条件に該当するレコードが1つでも存在することを確認できれば良いわけで、全件を取得する必要はありま

元記事を表示

TableExportで好きな位置にExcelやCSV出力ボタンを配置する

# はじめに
JQueryプラグイン「TableExport」ではテーブルを簡単にExcel、CSV、テキストファイルなどで出力できます。ただ、出力ボタンの位置は上下で固定っぽくて不便だったので、改善策を備忘録として残しておきます。

TableExport自体の使い方は[こちらのサイト](https://www.wp-benricho.com/tableexport/)が分かりやすいので参考にされてください。

開発環境は以下の通り

* Ruby 2.6.3
* Rails 5.2.4.4
* jQuery 1.12.4

(Ruby on Rails使用してますが、今回の記事ではjQueryのみ取り上げているのであまり関係ないかと思います)

なお、bootstrapを使えばデフォルトでオシャレなボタンにできますが今回は使いません。

# 問題点
Railsでタグ機能を実装

# はじめに
現在作成しているアプリでタグ機能を実装したのでその実装方法を残しておきます。
Railsにはタグ機能の実装を簡単にしてくれる acts-as-taggable-on というgemがありますが、関連付けの練習も踏まえて自前で実装します。
現在作っているアプリのPK,FKのみを示したER図は以下のようになります。
![スクリーンショット 2020-11-25 9.00.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787216/db684754-dcd6-51c8-13e2-eabdc4a650b5.png)

# 実行環境
この記事は以下の環境で動作確認しています。
ruby 2.7.1
rails 6.0.3
DB MySQL

# モデルの作成
Profileモデルは既に作ってあるという前提で進めていきます。
まず、tagモデルとtag_relastionshipモデルを作成します。

“`
$ rails g model tag name:string
$ rails g

元記事を表示

【Rails】device機能【備忘録】

こんにちは。Web開発6週目、Rails初心者の あをか です。
初心者にとってdeviceというgemはブラックボックスで、何がどう繋がっているのか把握しづらかったです。

復習も兼ねて、deviceの導入過程を書いていきます。

■ ログイン機能(device)

①deviceを入れてモデルとテーブルを作ろう

 gem ‘device’とGemFileに書き、
 ターミナルで①bundle install➡②rails g devise:installする。
 続いてログイン機能で欠かせないuser情報を扱うために、モデルとテーブルを作成したい。
 rails g model User string:name, string:email,…かと思いきや、deviceの時は違う。
 rails g devise UserだけでUserテーブルの中身まで作成してくれる。
 ただしdeviceで作成したテーブルのカラムは、デフォルトではemailとpasswordだけ。

元記事を表示

Railsの1対多の作成

本投稿の目的

・Rails学習の議事録です。

学習に使った教材

Udemyの以下2つの教材を参考にまとめました。
・[“はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう”](https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/)
・[“フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座”](https://www.udemy.com/course/rails-kj/)

○1対多とは?

・紐づいたmodel間での関係の名称
・ex)ツイートmodelとコメントmodle
・この時,ツイート1つに対して複数コメントが可能
・この関係を”1対多”の関係と呼ぶ

**【説明の簡略のために書き省略記号を使用】**
・素となるmodel = model(1)
・紐づくmodel = model(多)
*(コーディング例では任意のmodel名が入る)

**【1対

元記事を表示

コントローラーとビューを同時に作成

#コントローラーとビューを同時に作成

####作成方法
% rails g controller ‘コントローラー名/ビューのファイルの名前’ index

(例) % rails g controller tests index

– testsコントローラーにindexアクションが作られる
– viewsのtestsフォルダにindex.html.erbファイルが作られる

元記事を表示

Heroku上のRailsアプリにScoutを導入

## Herokuの管理画面からアドオンを追加
ダッシュボードから操作する方法と、コマンドラインから操作する方法があります。
アドオンを追加した時点で、環境変数が自動でセットされます。

### ダッシュボードから操作する場合
– Herokuのダッシュボードにアクセス
– Resourcesタブを開く
– Add-onsの下の検索窓に’Scout’と入力
– Provisionをクリック

### コマンドラインから操作する場合
Heroku CLIがインストールされている状態で以下のコマンドを叩く

“`zsh
$ heroku addons:create scout
“`

## Gemを追加
“`rb:Gemfile
gem ‘scout_apm’
“`
“`zsh
$ bundle install
“`

これだけ。アプリにリクエストが無いとメトリクスは表示されないので注意。導入直後に見ても多分反映されていなくて、本番のアプリを適当に触った上で、数時間後に確認すると反映されてます。

元記事を表示

中間テーブルを使ったお気に入り機能の実装!

##実装したいこと

* 掲示板にブックマーク機能を追加したい。

* ユーザーがブックマークした掲示板を一覧できるページを実装したい。

これだけの機能なのに、めちゃくちゃ難しい。いろんなことを調べるいい機会になりました。
かなり多くのものを調べたので順序立てて説明をしていきます。

###実装の大まかな流れ

* 中間テーブルとなるBookmarkモデルの実装
* UserモデルとBoardモデルとのアソシエーションを実装
* Userモデルにお気に入り登録のギミックを定義
* BookmarkControllerの実装
* Routingの設定
* Viewの実装

##Bookmarkモデルの仕組み(多対多)
で、いざお気に入り機能をつけよう!となってもどうやって実装するの・・・?となります。なので、まずどうUserモデルとBoardモデルに紐づけていくのか考えて見ましょう。

###UserとBookmarkとBoardの関係
ユーザーと掲示板とブックマークの関係を見ていきましょう。

ユーザーはたくさんの掲示板をブックマークすることができます。反対に、掲示板はたくさんの

元記事を表示

OTHERカテゴリの最新記事