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

Rails関連のことを調べてみた2020年02月15日
目次

Could not find nokogiri-1.10.7 in any of the sources (Bundler::GemNotFound) が出た時の対処法

`rails generate`を実行したら以下のエラーが出た。

“`sh
$ rails generate controller Welcome index
Traceback (most recent call last):
22: from /Library/Ruby/Gems/2.6.0/gems/spring-2.1.0/bin/spring:49:in `


21: from /Library/Ruby/Gems/2.6.0/gems/spring-2.1.0/lib/spring/client.rb:30:in `run’
20: from /Library/Ruby/Gems/2.6.0/gems/spring-2.1.0/lib/spring/client/command.rb:7:in `call’
19: from /Library/Ruby/Gems/2.6.0/gems/spring-2.1.0/lib/spring/client/server.rb:9:in `call’

元記事を表示

#Rails の ActiveRecord create の返り値で レコードが作成保存されたかどうかを確認する ( persisted? )

– create! と違い create は例外を起こさない
– 返り値が model class の instance になるので、 persisted? ( 永続化されたかどうか? ) を聞くと良さそうだ。
– SQLレベルで失敗した場合は例外扱いになり、返り値は得られないようだ。

“`rb

# ————————-
# 作成成功ケース
# ————————-

succeeded_created = User.create(name: “yy”)
# (1.0ms) BEGIN
# User Exists (1.4ms) SELECT 1 AS one FROM `users` WHERE `users`.`name` = BINARY ‘yy’ LIMIT 1
# User Create (1.4ms) INSERT INTO `users` (`name`, `created_at`) VALUES (‘yy’, ‘2020-02-13 23:42:17’)
# (4.9ms) COM

元記事を表示

【Rails6】DEPRECATION WARNING: Rails 6.1 will return Content-Type header without modification. If you want just the MIME type, please use `#media_type` instead.

# 環境
– Ruby: 2.6.3
– Rails: 6.0.2.1

# なんだこのWarning :thinking:
“`
DEPRECATION WARNING: Rails 6.1 will return Content-Type header without modification. If you want just the MIME type, please use `#media_type` instead.
“`

`ActionDispatch::Response#content_type` を呼ぶとこんなWarningが出ました。

– Rails6.1からContent-Typeヘッダの値をそのまま返すよう変更するよ(これまではcharsetを除外してたけど含まれるようになるよ)
– MIME typeだけが欲しい場合は `ActionDispatch::Response#media_type` を使ってね

と言われています。

欲しいのは `text/html` とか `text/plain` みたいなMIME typeでしたので、

`Acti

元記事を表示

Docker コンテナ内のrailsコマンドが呼び出せなくなったのでメモ

# 概要
docker環境で、
railsチュートリアルを進めていたら、
急に下記のようにrailsコマンドが呼び出せなくなったので、
対処方法をメモ

“`
bash: rails: command not found
“`
# 環境
こちらの記事を参考にrailsのdocker環境を構築
https://qiita.com/reflet/items/f73cac406760ee4ecc13

# 解決策
railsのDockerファイルに下記のようにパス通しを記載しrailsコマンドを呼び出せるようにした。

“`
ENV PATH $PATH:/usr/local/src/bin
“`

### そもそもコマンドって?
我々が普段使っている`cd`や`ls`などは、魔法でもなんでもなく、全てプログラム
このプログラムを呼び出すための略称がコマンドという認識で良いと思います。

自分は、元々windowsユーザなのですが、Windowsユーザだと
exeファイルがイメージし易いかと思います。
C言語とかで、コマンドプロンプトに`HelloWorld`と表示する`hello

元記事を表示

[font-awsomeのエラー]NoMethodError in Creditcard#indexの一例

#1.エラーの内容
スクリーンショット 2020-02-15 4.16.35.png

fontawsome利用の記述をしたところそのようなメソッドないというエラーが出ています

#2.エラーの原因
公式の記載方法に則っていましたが、gemfileに`gem “font-awesome-sass”`が抜けているからno methodエラーとなっていました

#3.エラーの解決方法
gemfileに`gem “font-awesome-sass”`を記載し、`bundle install`をすることで正しく読み込まれます

元記事を表示

[Rails]ActionController::UnknownFormat in UsersController#indexの解決方法

#1.エラーの内容

<エラー文の例>
スクリーンショット 2020-02-15 4.03.58.png

題名部分の英語を読むと”creditcard_controllerに定義したindexアクションはありません”というエラー文となっています

#2.エラーの原因
1.viewファイルを作っていない
`rails g controller xxx`によってファイルを生成した直後はapp/view/xxxフォルダまでしかできておらず、viewファイルは手動で作成する必要があります

2.app/controllers/xxx_controller.rbの中の `def 〇〇` に連動したファイル名としていない
railsの機能によりcontroller.rbファイルの`def 〇〇`をrequire ‘./v

元記事を表示

TechCommitのお年玉企画で当たったTechpitの教材「Tinder風マッチングアプリを作ってみよう!」を終えて

# TechpitのTinder風マッチングアプリを作ってみよう!を完了しました

Qiita初投稿です。
TechCommitのお年玉企画で当選したこちらの教材を無事終わらせることが出来たので、感想と学んだことのメモを残しておきます。

## 学んだこと

– **content_tag**は動的にHTMLを生成出来る便利なコード。erbとhtmlが混ざってしまう時にすっきり書ける。
– `content_tag(:i, “”, class: “fas fa-cog fa-2x”)` → `[Rails]gem devise インストール

deviseとは

deviseとはrailsで作ったwebアプリケーションに簡単に認証機能を実装できるgemのことです。認証機能はログイン、ログアウト機能の事です。
deviseをインストール

1. Gemをインストールするために、Gemfileに追記

基本的に1番下に記載するのが無難です。

gem ‘devise’

以下はNG例です。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576859/a04c5841-573c-088e-1930-d30da3d5a60a.png)
上記の記述だとdevelopment環境から、テストや本番環境に移行していくので、その際に対応できなくなります。

2. Gem記載後、実際にdeviseのインストール

bundle install

を実行してgemを読み込みます。

3. deviseが入ったか確認

Gemfile.lockというファイルにはインストールされたgemが一覧表示されているので

schema.rbにマイグレーションファイルが反映されない!

## 開発環境
ubuntu(WSL)
Rails 5.2
Postgresql

## 想定エラー内容

“`
ActionView::Template::Error (PG::UndefinedColumn: ERROR: column tasks.user_id does not exist
LINE 1: SELECT “tasks”.* FROM “tasks” WHERE “tasks”.”user_id” = $1 O…

“`

## 原因
一概には言えないですが、おそらく`rails:db migrate`した後にマイグレーションファイルを書き換えている。

## 対処法
`rails db:migrate:status`で反映されているか確認する。
upは反映済み。downは未反映。

“`
Status Migration ID Migration Name
————————————————–
up 20200213054056 Create users

【Rails】中級者になるためのリファクタリング

Railsのリファクタリングの記事は、良記事がたくさんあります。

でも「初心者向け」を謳っているにしては項目が多くて、**いきなり全部を意識するのは無理だな**ってなりました。初心者向けって謳い文句の記事に、自分のできていないことがたくさん書かれていると「お前は初心者以下だ」って言われているみたいでちょっと嫌な気持ちになりますね。

他の方が書いた記事の中から、私がまず意識しようと思ったことをピックアップしてまとめようと思います。

##controllerを薄く、modelを厚く
可能な限り処理をメソッドとして切り出して、controllerを薄くします。
modelがFatになることは、最初は目をつぶります。

##viewの中の処理をhelperに移す
viewの中に処理がゴチャゴチャと書かれていると、コードが混沌としてしまうので。

##パーシャルをどんどん使う
パーシャルを使って、可読性と再利用性を上げます。

##jsはjsファイルに
ページごとのjsファイルを作り、そこに書く。

##繰り返し使う文字列をlocaleに定義する
コードをDRYに。時刻のフォーマット等もl

【Rails】localeの使い方

##localeとは
もともとは多言語化用の言語ファイル。
多言語化以外にも、何度も使う文言を一限管理するために使われる。
住所、会社名、時間をフォーマットする時の形式、今日の日付を出力する時の形式などを管理する。

##基本
`config/application.rb`でデフォルトの言語を指定

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

`config/locales`以下にlocaleファイルを作成

“`config/locales/ja.yml
ja:
hello: Hello World
company:
name: サンプル株式会社
address: 〒231-0001 神奈川県横浜市中区新港2丁目7−1
“`
“`erb:viewから呼び出す
<%= t('hello') %>
<%= t('company.name') %>
“`
“`rb:modelから呼び出す
I18n.

RailsでFontAwesomeの導入〜大きさを変えるまで

#はじめに
railsでFontAwesomeを使いたいと思い調べていたところ、
大きさまで変える記事が見当たらなかったため投稿してみました。
#実行環境
Ruby : 2.6.3
Rails : 5.2.4
slim : 4.0.1
font-awesome-sass : 5.12.0
上記の環境で実装いたしました。

#FontAwesomeの導入
Gemfileに以下を記述

“`ruby:Gemfile

gem ‘font-awesome-sass’
“`
gemをインストール

“`
bundle install
“`
/app/assets/stylesheets/application.css

/app/assets/stylesheets/application.scss
に変更する

“`
mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
“`

/app/assets/stylesheets/application.scssに以下を記

RSpecでFactoryBotから複数のインスタンスをまとめて作成する【create_listを使用】

RSpecテストを書いているときに、複数のインスタンスをまとめて作れる便利メソッド`create_list`をご紹介します。

例えば下記のように`note`のファクトリが定義されているとします。

“`factory/notes.rb
FactoryBot.define do
factory :note do
title { ‘sample-note’ }
description { ‘sample-description’ }
end
end
“`

テストで`note`インスタンスを5つ作りたいと思ったとき、下記のように1つずつ作るのは大変です。

“`spec/system/xxx_spec.rb
RSpec.describe ‘yyyy’ do
let(:note1) { create(:note) }
let(:note2) { create(:note) }
let(:note3) { create(:note) }
let(:note4) { create(:note) }
let(:note5) { crea

【Rails】wicked pdfの導入方法、ハマったところと対応

##導入方法
“`rb:Gemfile
gem ‘wicked_pdf’
gem ‘wkhtmltopdf-binary’
“`
“`terminal
$ bundle install
$ rails g wicked_pdf
“`
“`config/initializers/wicked_pdf.rb
WickedPdf.config = {
:exe_path => “#{Gem.loaded_specs[‘wkhtmltopdf-binary’].full_gem_path}/bin/wkhtmltopdf”
}
“`
ここで一度サーバーを再起動

“`pdfs_controller.rb
def bill
respond_to do |format|
format.html
format.pdf do
render pdf: ‘bill’,
layout: ‘pdf’,
encording: ‘UTF-8’,
template: ‘pdfs/bill’

【Rails】Modelで定義した定数にViewからアクセスする方法

表題の通り、定数にアクセスできずに困った人のための記事です。

# 結論
**Model名::定数名**とすればOKです。

# 解説
下記のUserクラスがあるとします。

“`models/user.rb
class User < ActiveRecord::Base MAX_NUMBER = 10 ... end ``` Viewから参照するには、下記のようにします。 ```views/xxx.html.erb 最大値は#{User::MAX_NUMBER}です。 ```   これが下記のようになっていると、 ```views/xxx.html.erb 最大値は#{MAX_NUMBER}です。 ``` ↓ ```ruby uninitialized constant ActionView::CompiledTemplates::MAX_NUMBER ``` そんな定数は無いと怒られてしまいます。 以上です!

Railsのform_forで、bootstrap4を使ってフォームを横並びにする方法

#概要
Railsのform_forを使っている箇所で、フォームを横並びにするのに少しハマったので、共有させていただきます。

#環境
ruby 2.6.3 Rails 5.1.6 bootstrap 4.4.1

##方法
bootstrapのグリッドシステム(rowとcol-*(数字))を使う。
フォームをdiv.rowで囲って、横並びにしたい要素をdiv.col-*で囲む。
(上記少し誤解を与える表現ですが、下記注意点をご参照ください)

##注意点
form_forメソッドの外側でなく、内側にdiv.rowを配置する。

##具体的な方法(OKパターン)
“`erb:home.html.erb
<%= form_for(:session, url: login_path) do |f| %>

<%= f.label :email %>
<%= f.email

ActiveRecordのトランザクションのネストに気をつけること

– 確認した環境
– Ruby 2.5.1
– Rails 5.2.1
– MySQL 5.7.27

腕試しに以下のスクリプトを実行した場合、最終行の `User.first.name` は何が得られるか考えてみてください.

“`ruby
User.first.update!(name: ‘Alice’)

ActiveRecord::Base.transaction do
User.first.update!(name: ‘Bob’)

ActiveRecord::Base.transaction do
User.first.update!(name: ‘Carol’)
raise ActiveRecord::Rollback
end
end

User.first.name
“`

正解はここをクリック

`User.first.name` の結果は **Carol** になります.
正解しましたか?
正解する人もいると思いますが直感と違うかと思います.

<

ぼっち演算子

Deviseを使ったRailsのコードがあるとします。
これはDeviseを使用したときのcurrent_userに対して、nicknameカラムに
あるデータを取得して@nicknameに代入することを意図したものです。

————

@nickname = current_user.nickname

————–
ただし、ログインしないときにこれを実行するとnilに対してメソッドを使おうとしてエラーになってしまいます。

これを回避できる記述がRuby2.3からできるようになりました。
それがどのような記述か、またそれはどのような動きをするのかについて説明していきます。

解答
@nickname = current_user&.nickname

&はsafe navigation operator、 lonely operator(ぼっち演算子)などと呼ばれる演算子です。

メソッドに続けて記述すると、そのメソッドがnilでなかった場合のみ右辺のメソッドが実行されます。

もしnilだった場合は全ての演算結果としてnilを返します。つまり

ルーティングを設定してCSVデータのダウンロード(出力)を実装する方法

# 目的
– Qiitaの記事に大まかな流れをテンプレート化しておき、作業効率を上げる。
– 今までの実装では `send_data` しか使ったことなかったのでメモ

# 前提条件
– ruby 2.6.0
– ruby 5.2.2

# 手順

1. routes.rbにCSVダウンロード用のルーティングを設定する
2. コントローラーに変数を定義、その他諸々を設定
3. 出力データを作成(アクション名.csv.ruby)
4. CSVダウンロードボタンを設定したいviewファイルに書く

※コード内容は適当

## 1. routes.rbにCSVダウンロード用のルーティングを設定する

“`ruby:config/routes.rb

resources :card_infos do
collection do
# デフォルト形式をcsvに設定
get :csv_download, defaults: { format: ‘csv’ }
end
end
“`

|Helper|HTTP Verb|Path|Controller#Action|

[Rails] scriptタグ内でRuby/Railsのメソッドを使用する際のescape_javascriptについて

## この記事を書くきっかけ

jQueryを書いていると、scriptタグ内でRailsのメソッド(正確にはapplication_helper内のメソッド)を使用したいときがあります。
正しい書き方をしないと正確に呼び出せないため、失敗した書き方と成功した書き方をまとめます。

## 前提

current_userの属性によってpathを切り替えるメソッドを
`def hogehoge_path_for`とし、application_helper.rbに定義します。

“`ruby:application_helper.rb
def hogehoge_path_for
if …
hoge_path
else
hogehoge_path
end
end
“`

これをとあるviewのscriptタグ内で呼び出します。
`let path = hogehoge_path_forの返り値`
としたいです。

## 失敗例1

“`erb:あるview