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

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

【RSpec】重複のバリデーションエラーを回避するFactoryBotの書き方

ユーザー登録でemailを重複させないようにバリデーションをかけましが、テストのときにでFactoryBotで複数ユーザを予め生成する必要があったので方法を調べました。シーケンスを使ってユニークなデータを生成するやり方で、備忘録として残します。

問題点

ファクトリーで複数のユーザをセットアップする際に、emailをバリデーションでユニークなデータとして設定している場合、下記のようにするとテストコードが走る前に例外が発生します。

“`ruby:spec/factories/users.rb
FactoryBot.define do
factory :user do
user_name { “tester” }
email { “tester@example.com” }
password { “password” }
end
end
“`

“`ruby:spec/models/user_spec.rb
it “複数のユーザー登録” do
user1 = FactoryBot.create(:user)
user2 =

元記事を表示

【Rails6】ActiveRecordで与えられた配列順にorderする

# やりたいこと
ActiveRecordを与えられた配列順でorderしたい。
ids配列にユーザのidが格納されていて、このidの格納順に従って、Userモデルに対してorderしたい。

“`ruby
ids = [6,2,24,5,3,7]
“`

# 問題
Rails5.1までは以下の書き方で配列ids順にuserをorderすることができました。

“`ruby
User.where(id: ids).order([‘field(id, ?)’, ids])
“`

しかし、Rails5.2以降(Rails 6も)ではこのような書き方をすると
エラーが発生します。

“`
DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): “FIELD(id, ?)”. Non-attribute arguments will be disallowed in Rails 6.1

元記事を表示

uninitialized constant ActionDispatch::Session::RedisStore (NameError)

# エラーの内容
Rails 5.2からはredisがビルドインされるようになりました。
それに伴い`redis-rails` gemが不要になったとのことでGemfileから削除しましたが、以下のエラーが発生しました。
https://railsguides.jp/5_2_release_notes.html#redis-cache-store

`NameError: uninitialized constant ActionDispatch::Session::RedisStore`と言われているので、Redis関連の設定に関係していることがわかります。

“`
NameError: uninitialized constant ActionDispatch::Session::RedisStore
/usr/local/bundle/gems/railties-6.0.2.1/lib/rails/application/configuration.rb:282:in `const_get’
/usr/local/bundle/gems/railties-6.0.2.1/lib

元記事を表示

Rails の Credentials を Webpacker で管理するフロント側に共有したい

賛否ありますが、Railsにベッタリの開発をしていると、なるべくRailsに寄せて考えたくなることがあります。

そんな

– Webpacker 使ってるプロジェクト
– 環境によって変わる値を環境変数ではなく Credentials にまとめたい。分散させたくない。
– フロントエンドでも使いたい。たとえば Firebase の Project ID や API Key のようなDev,Stg,Prod環境ごとに違って、かつフロントエンドコードに含めて問題ないもの。

そんなときの話です。

– webpack 4.41.5
– webpack-dev-server 3.10.2
– webpacker 4.2.2
– Rails 6.0.1

## Webpacker::Compiler.env は bin/webpack-dev-server を使うとうまくいかない

こんな Credentials があったとき

“`yaml
# bundle exec rails credentials:edit –environment=development
firebase:

元記事を表示

herokuのデータのバックアップとローカルのデータベースへのリストア

しょぼいメモを残します
データベースでpostgresqlを使っている時のみです。

## バックアップ
“`
curl -o latest.dump `heroku pg:backups public-url -a アプリ名`
“`

## リストア
“`
pg_restore –verbose –clean –no-acl –no-owner -h localhost -U ローカルのDBユーザー名 -d ローカルDB名 latest.dump
“`

元記事を表示

[rubocop] インデントを揃えるgem【初学者おすすめgem】

#概要
今回は効率よくインデントを揃えるgemの紹介をします。

プログラミングを学習してはや6ヶ月経ちました。
少しづつ転職も始め、ある企業様から私のgitをみてインデントがオカシイと非常にありがたいフィードバックを頂きました。
そこで**第三者からみて**コードの読みやすさの大切さに改めて気づきました。
##こんな人に読んでほしい!!
– 現在、プログラミングを独学またはプログラミングスクールで学び、転職しよう!って思っている方。
– インデントを効率よく揃える方法を知りたい!って思っている方。
– 綺麗なコードを書きたい!って方。

#綺麗なコードを書く重要性
エンジニアとして働くにあたり、
**他の人が読みやすいコードを意識する**必要性があると思いました。

##理由
(1)プロダクトの共同開発
(2)万が一、担当から外る or 担当のメンバーが増えた際に、プロダクトのスムーズな引き継ぎ
(3)バクが起きた際に、可読性が高いと解決できるスピードが早まる

※あくまで私が思い浮かんだ理由をあげました。もしかしたら他にも理由があるかも知れません。

以上の理由から、現場に入った

元記事を表示

rails チュートリアル2週目~ヘルスケアwebサービスを自分で作る医者の日記~

2章最後でつまづく

“`
We’re sorry, but something went wrong.
If you are the application owner check the logs for more information.
“`
“`
heroku run rails db:migrate
“`
するもだめ

ログ確認すると
“`
2020-02-04T11:59:16.635000+00:00 heroku[router]: at=info method=GET path=”/” host=hidden-ravine-49191.herokuapp.com request_id=309bfa62-5483-4e2d-84c9-2e306989f7d0 fwd=”118.109.109.117″ dyno=web.1 connect=0ms service=13ms status=500 bytes=1827 protocol=https
2020-02-04T11:59:16.622565+00:00 app[web.1]: I, [2020-02-0

元記事を表示

if current_user.admin? && !current_user?(user)で「!」が必要な理由

##事象
railsチュートリアル「10.4.2 destroyアクション」において、
「現在のユーザーが管理者のときに限り」という条件を作るためにチュートリアルでは、下記のように記載されていました。

“`app/views/users/_user.html.erb
<% if current_user.admin? && !current_user?(user) %>
“`

2つの条件が成り立つ場合のif文になります。
右の条件において先頭に「!」が必要になる理由がわからなかったので記事にしました。
具体的には、現在のユーザーを「!」で否定すると条件が成り立たないのではと疑問に思っていました。

※左の条件は現在ログインしているユーザーが管理者権限を持つか判定しています。

##!の意味
!はnot演算子です。
式の値が真である時偽を、偽である時真を返します。

`!true=>false
!false=>true
`

##!current_user?(user)が何を表すか
current_user?の判定を「!」で逆転しています。
ここでは、
current_user

元記事を表示

【jQuery】リロードしないとプレビュー表示できない→turbolinksが原因

写真投稿アプリを作成中に、jQueryを用いてプレビュー表示機能を実装しようとした所、うまくプレビュー機能が機能せず、リロードを行うとプレビュー表示が成功するという問題に直面しました。
調べた所、初心者に多いミスらしく、私自身もJavaScriptにおいてturbolinksの概念が無かったため、解決にかなり時間を要しました。
ネット上でも同じような悩みを抱えている方が多かったため、参考になればと思い手順をまとめました。

##環境
ruby 2.5.1
rails 5.2.4

##やりたかった事

写真投稿フォーム

画像を選択

選択した画像がプレビュー表示される

##発生した問題

写真投稿フォーム

画像を選択

$\color{red}{\rm 選択した画像がプレビュー表示されない}$

リロード

画像を選択

選択した画像がプレビュー表示される

###問題のコード

“`js:jquery
$(function(){
fileField = $(‘#file’)
#選択された画像を取得し表示
fileField.on(‘

元記事を表示

【Rails】Action Mailerのメール送信に失敗する

#症状
Action Mailerを利用したメール送信処理で、以下のエラーを吐いてしまう。
なお以前は正常に送信することができていた。

`Net::SMTPAuthenticationError (530 Authentication required):`

`ArgumentError (SMTP To address may not be blank: []):`

#原因
環境変数を正常に読み込めていなかった。
SMTP認証情報やお問い合わせ宛先メールアドレスを環境変数に入れていたため、それらの情報を利用することができず、送信に失敗した。

#対処
1.アプリケーションサーバー停止
`pumactl stop`

2.アプリケーションサーバー起動
`rails s`

#根本原因は?
不明。
EC2のインスタンスを止めたり、立ち上げたりしていたので、それが契機っぽいが。。

元記事を表示

config/initializersにカスタムバリデータを定義する

## 電話番号にバリデーションを使用する
[telephone_number](https://github.com/mobi/telephone_number)というgemを使用してカスタムバリデーションを定義する。

まずはgemを定義

“`
gem ‘telephone_number’
“`

そしてbundle install!

“`
$ bundle
“`

config/initializeに下記のように定義

“`config/initializers/tel_validator.rb

module ActiveModel
module Validations
class TelValidator < EachValidator def validate_each(record, attribute, value) return if value.blank? record.errors.add attribute, :invalid unless TelephoneNumber.valid?

元記事を表示

CentOS7(Docker)でRuby on Railsを構築しようとしたらグダグダした話

次のプロジェクトで扱うシステムがRuby on Railsで構築されている。
ruby及びrailsは全く触った事が無かったので、家で勉強しようとして、
centos7コンテナ上で実行するまでにぐだぐだした話を**端折らず**に書く。

# イメージをpull
“`bash
docker pull centos:7
“`

# コンテナ起動
“` bash
docker run –name test -itd -p 3000:3000 centos:7 bash
“`

# コンテナに接続
“` bash
docker exec -it test bash
“`

# ruby入れる
“`bush
yum install ruby -y
“`

“`bash
ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
“`

# rails入れる
“`bash
gem install rails
“`
“`bash

ERROR: Error installing rails:
i18n requi

元記事を表示

コード書いたことないPdMやPOに捧ぐ、Rails on Dockerハンズオン vol.2 -Hello, Rails on Docker-

この記事はなにか?

この記事はが社内のプログラミング未経験者、ビギナー向けに開催しているRuby on Rails on Dockerハンズオンの内容をまとめたものです。ていうかこの記事を基にそのままハンズオンします。ハンズオンは
1回の内容は喋りながらやると大体40~50分くらいになっています。お昼休みに有志でやっているからです。
現在進行形なので週1ペースで記事投稿していけるように頑張ります。
ビギナーの方のお役にたったり、同じように有志のハンズオンをしようとしている人の参考になれば幸いです。

他のハンズオンへのリンク

・ [Vol.1 – Introduction -](https://qiita.com/at-946/items/ffc0ebcc4d08f958197b)
・ Vol.2 – Hello, Rails on Dock

元記事を表示

Rails6 のちょい足しな新機能を試す 119(filter_paramters 編)

# はじめに

Rails 6 に追加された新機能を試す第119段。 今回は、`filter_parameters` 編です。
Rails 6 では、 filter_parameters で proc を使って、フィルターしたときに、パラメータが配列になっているときに、フィルターされないというバグが修正されています。

Ruby 2.6.5, Rails 6.0.2.1, Rails 5.2.4.1 で確認しました。 (Rails 6.0.0 でこの修正が入っています。)

“`shell
$ rails –version
Rails 6.0.2.1
“`

今回は、User を2つ登録する画面を作って、その動作を確認します。
なお、 `filter_parameters` の動作を確認するための手抜き実装になってます。

# Rails プロジェクトを作る

Rails プロジェクトを新たに作成します。

“`shell
$ rails new rails_sandbox
$ cd rails_sandbox
“`

# User モデルを作る

`name` を持つ Us

元記事を表示

【アプリ新規作成】bundle installができない!【解決】

どうも、おささです。
エラーから始まる初投稿( ゚∀゚)・∵. グハッ!!

事の発端は、
railsで新規アプリを作成しようと、
ターミナルから「rails new」をした後に起きたある事件。

      「 Could not locate Gemfile 」

・・・はて?

先月プログラミングを始めた私には難易度の高い問題だった。

どうやら
「ジェムファイルがそのコマンドを実行させているフォルダにありません」
ということらしい。

元々同じアプリは作っていて、復習のために再度作り始めようとした時、
別のエラーが出たので一度全部削除をした矢先の出来事だった。

「さっき消したのがまずかったんだろうか・・・」
「もう一度ゴミ箱から復活させれば戻るだろうか・・・」

・・・

戻らない。

記事を色々調べた結果、

   「 Gemファイルをインストールする階層が違った 」

ターミナルで、pwdを入力し確認したつもりだった。
”つもり”だった。
きっと、そこでつまずくと思わず、気を抜いていたんだろうと思う。

階層を一つ下にしたところ、無事インストールされました

元記事を表示

HTMLメールで画像を載せる [rails][初心者]

#HTMLメールに画像を載せたい

####すでにメール送信はできるけど、画像がうまく表示されない
これを記述する:point_down_tone2:

“`mailer.rb
attachments.inline[‘画像file名’] = File.read(‘app/assets/images/画像file名’)
“`

おそらくここの部分`’app/assets/images/画像file名’`
はpublic配下とかでも大丈夫だと思います。

“`mailer.rb

def send_when_creater(user)
attachments.inline[‘vegetable.png’] = File.read(‘app/assets/images/vegetable.png’)
@user = user
mail to: user.email,subject: “こんにちは”
end
end
“`

###mailer view
画像を表示したいところに記述しましょう:point_down_tone2:

“`html.erb
省略

元記事を表示

enum属性をもつカラムの値を取得する [初心者][rails]

##enum属性をもつカラムの値を取得したい

モデルに記述するこういうのです:point_down_tone2:

“`ruby
enum status: {
error: 0,
shipping: 1,
completed: 2,
}
“`

errorはなんらかの不具合、shippingは配送中、completedは配送完了

ちなみにstatusカラムの `error: 0` は
errorが`key`
0が`value`

##key取得方法
上記のようなstautsカラムをもつOrderモデルで

“`ruby
Order.shipping?
“`

で取得可能
enumの便利なメソッドです:thumbsup_tone2:

###間違えた例

“`ruby
Order.status.shipping?
“`

と記述してしまいエラーになっていました

元記事を表示

【全解説付き】Rails本番環境向けの一番シンプルなDockerfile

何度か Rails の本番環境を Docker で構築してきて、イメージの設計図ともいえる `Dockerfile` も段々と洗練され、ここしばらくで一番シンプルなものに落ち着いた。シンプルでありながら、イメージサイズをコンパクトに、またビルド時間もなるべく抑えられるバランスの良い構成にできたので、ここで紹介する。

# 方針

シンプルな `Dockerfile` を目指しつつも、十分実用(本番環境用)として使えることを意識している。具体的には、以下のような方針:

* **`Dockerfile`をなるべくシンプルに保つ** → 読みやすく、保守しやすいように
* 命令は基本的に最低限かつ素直に書いて、Docker特有の「トリック」は必要なときにだけ使う
* `Dockerfile`が複雑になりがちなマルチステージビルドなどは、今回は不採用
* **イメージサイズをなるべく小さくする(が、最小にはこだわらない)** → デプロイ時間の短縮、ストレージの節約のため
* 不要なパッケージやキャッシュ等は極力削除する
* ただし、`Dockerfile`が

元記事を表示

Docker docker-compose up時、You must use Bundler 2 or greater with this lockfile. という地獄のエラー

#背景・エラー発生状況
1. Dockerfileとdocker-compose.ymlの作成
2. Dockerfileの記載
3. docker-compose.ymlの記載
4. database.ymlの変更

この流れを行った後に、
###docker-compose up
行ったところ、

“`
You must use Bundler 2 or greater with this lockfile.
“`

なんだこれは、、、

bundlerが悪さしていることに間違いない!!
bundlerのversionを調べて見ると!

###2.0.1

#いろいろ調べた結果、、、
##Bundlerのバージョン2.0.1が悪さをしている模様。
以下の手順で以前のバージョンを入れる
1. gemfile.lockの中身全削除
2. $ gem install bundler -v バージョン
  古いバージョンのBundlerのGem取得
3. $ bundler バージョン install 
  Bundlerをインストール
4. docker-compose build

元記事を表示

Dockerを使ったRuby on Railsで問い合わせフォームの作成

#問い合わせ機能の実装
自分向け個人的な備忘録。
開発環境はDockerを使用。
view画面ではhamlを使用。
行う順序としては

1. routesの設定
2. コントローラーの設定
3. 問い合わせフォーム作成
1. モデルの作成
2. viewの作成
4. 問い合わせフォームのMailers

#1. route設定
– scaffoldでcontactsのCRUDを作成する。

“`
$docker-compose run web rails g scaffold contacts

$docker-compose run web rake db:migrate
“`

/app/views/contactsフォルダの中に、

**・confirm.html.haml**
**・thanks.html.haml**

を作成する。

“`ruby:config/routes.rb
resources :contacts
“`

となっているので

“`ruby:config/routes.rb
resources :contacts do
collec

元記事を表示

OTHERカテゴリの最新記事