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

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

Rails コーティング規約について 1

# はじめに
Ruby、Railsの基礎を学習中の方に向けて記載致します。
[Rubyのコーティング規約はコチラをクリック願います。](https://qiita.com/raigakun/items/80ba30671d7b2b18c44e)
私自身これからチーム開発を行う上で大事にしたい。知っておきたいことをOutputします。

#Routing
####ActiveRecordのモデル間の関連を表現するには、入れ子型でルートを定義する。

“`ruby:qiita.rb
class Post < ActiveRecord::Base has_many :comments end class Comments < ActiveRecord::Base belongs_to :post end # routes.rb resources :posts do resources :comments end ``` #ActiveRecord ####なるべくhas_and_belongs_to_manyよりhas_many :throughを利用する。 ```

元記事を表示

【Rails6】DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1.

# TL;DR
`uniqueness` で grep して、ひたすら `case_sensitive: true` を付けていきましょう。
※既存の動作を維持する場合はこれでOK。ただ、この機会に見直すことを推奨します。

# 環境
– Ruby: 2.6.3
– Rails: 5.2.4.1 => 6.0.2.1 へアップデート

# なんだこのWarning :thinking:

“`
DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1. To continue case sensitive comparison on the :destination_type attribute in PublicReference model, pass `case_sensitive: true` option explicitly to the uniqueness validator.
“`

Uniqueness vali

元記事を表示

Rails Tutorialの知識から【ポートフォリオ】を作って勉強する話 #18.5 環境変数, Gmail送信設定編

# こんな人におすすめ
* プログラミング初心者でポートフォリオの作り方が分からない
* Rails Tutorialをやってみたが理解することが難しい

前回:[#18 EC2環境構築, Nginx+Puma+Capistrano編](https://qiita.com/aokyo17/items/281b5a1658ea58bc7b24)
次回:準備中

# 今回の流れ

1. Railsの環境変数を設定する
2. 本番環境でのGmailの送信を設定する

# Railsの環境変数を設定する
Rails5.2以降の環境変数の設定には、credentials.yml.encを使います。
デフォルトで.gitignoreになり暗号化されているのでおすすめです。
以下のように設定します。

“`shell:shell
EDITOR=vim rails credentials:edit
“`

“`yml:credentials.yml.enc
# aws:
# access_key_id: XXXX
# secret_access_key: XXXX

# Used as

元記事を表示

リファクタリングでモブプロみたいなことをしたお話

弊社内でエンジニア3人が集まって楽しくリファクタリングをした話です。

# 背景
社内のプロダクトで「手が空いてるならリファクタリングやってくれると嬉しい。手が足らない」というようなSOSを受け取り、
そのプロダクトをある程度知っている人 1人 + 知らない人 2人 の3人でリファクタリング部隊を作ってリファクタリングしていこうという話になりました。

今回は、モブプロ「みたいなこと」です。厳密なモブプロではないです。
なので、

– ドライバーも考える (みんなで考える)
– ドライバーは変わらない

という感じでゆるく進行しました。

## プロダクトについて
Railsで動いています。Rails3から始まり、今Rails5です。

– 7年ぐらい前から動いているプロダクト
– 新しく書いたところは新しく、古いものは古いという歴史が積み重なっている
– Rails3からのコードが残っている
– Rails何それ?Ruby何それ?から始まったコードが存在している
– ただファイルが分割されただけのコードがConcernsとして存在している
– でもテストはちゃんと書かれている

元記事を表示

初心者!current_userの使い方 〜ログイン中のユーザ名を表示〜

current_userでログイン中のユーザ名とメールアドレスの表示の仕方を紹介します。

**書き始めるときは`current_user`の前に`=`を忘れないでくださいね!**

###ユーザー名を表示 〜current_user〜

“`haml
.header__left-box__list
= current_user.user
“`

スクリーンショット 2020-02-06 0.57.26.png

メールアドレスを表示させたい↓

“`haml
.header__left-box__list
= current_user.email #nameからemailに変更

“`

スクリーンショット 2020-02-06</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>Rails</div>
<div class='tag-cloud-link'>MySQL</div>
<div class='tag-cloud-link'>haml</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/sawayu/items/9f879b859d00d8d9e8a7'>元記事を表示</a></div>
<h3 id=【Rails】I18n.tはtに省略できるんじゃない、省略したほうが良い

## I18n.tの省略記法
まだなんにもわかっていないRails触り始めて1週間くらいの頃、
**「RailsはViewファイル内では`I18n.t(‘hoge’)`って書かなくても`t(‘hoge’)`って書けるよ、
先輩たちもそう書いてるから合わせてね」**って言われてふむふむなるほど、
よくわからんがviewでは省略できるのかってなった経験はありませんか?

実はI18n.tをtにすると**文字が4文字節約できるってレベルではない変化**が起きていた

## つまりどういう事か
詳しい実相は[この辺](https://github.com/rails/rails/blob/a33dbb17b0818e8a2c75581275374bc0853958ca/actionview/lib/action_view/helpers/translation_helper.rb#L60)
`TranslationHelper`にtが実装されていたんですね

“`rails/actionview/lib/action_view/helpers/translation_helper.rb
de

元記事を表示

【Rails6】DEPRECATION WARNING: update_attributes is deprecated and will be removed from Rails 6.1 (please, use update instead)

# TL;DR
`update_attributes` => `update` に変更しましょう。
※安心してください。動作は変わりません。

# 環境
– Ruby: 2.6.3
– Rails: 5.2.4.1 => 6.0.2.1 へアップデート

# なんかWarning出たな? :thinking:

“`
DEPRECATION WARNING: update_attributes is deprecated and will be removed from Rails 6.1 (please, use update instead)
“`

`update_attributes`, `update_attributes!` を使っているところでこんなWarningが出ました。

`update_attributes` は Rails 6.1 で削除するから、代わりに `update` を使ってねって言われています。

# 変更しちゃって大丈夫? :thinking:

Railsのソースを見てみましょう。
https://github.com/rails/rail

元記事を表示

【Rails】Docker環境下でbinding.pryを使えないとき確認すべきポイント4つ

## はじめに
Docker環境下でこんなシーンに遭遇したことはありませんか?

**「Railsでバグ発生!デバッグしなきゃ!よーし、`binding.pry`しよう!」**

**「うわ、コンソール出ない!!!これじゃ何も出来ない!!!」**

こんな**やるせない気持ち**になった方のために、自分がこれまで詰まった箇所とその解決法を残しておこうと思います。

## 環境
“`yaml
OS: macOS Catalina 10.15.3
Ruby: 2.6.5
Rails: 6.0.2.1
Docker: 19.03.5
docker-compose: 1.24.1
“`

## 1.`binding.pry`のコンソールが出ない

`docker-compose up`などで**rails server**を立ち上げていて、`binding.pry`を入力した箇所で動作が止まっているのに、

**「コンソールが出ない!どうしよう!」**

という状態を想定しています。

### 解決法

“`shell
$docker container ls
“`
でRai

元記事を表示

RSpecの導入【備忘録】

#準備
###Gemfileを編集
RSpecを使用するアプリのGemfileを以下の通りに編集する
・「group :development, :test do 〜 end」に「gem ‘rspec-rails’」を追加
・「group :development do」に「gem ‘web-console’」を追加

“`
group :development, :test do
gem ‘rspec-rails’
end

group :development do
gem ‘web-console’
end
“`
###インストール
・ターミナルで「bundle install」を実行

“`
# RSpecを使用するアプリのディレクトリへ移動
cd ~/projects/sample-app

# 「bundle install」を実行
$ bundle install
“`

#RSpecの設定
###RSpec用の設定ファイルを作成
・下記のコマンドを実行

“`
$ rails g rspec:install
“`
###.rspecを編集
・下記を追

元記事を表示

RailsでHamlを書く

#概要
基礎的なhamlの書き方とhamlにおけるrailsヘルパーメソッドのルールを書きました。
特にヘルパーメソッドの書き方は初心者がよくsyntaxエラーを起こしやすい箇所なので参考になればと思います。

#HTMLタグ
##基礎
HTMLタグは基本的に「%」をつければOKです。

“`haml:haml
%div
%a
%input
%header
“`
“`html:結果(HTML)


“`
##クラス名、ID名
クラス名は「.(ドット)」、ID名は「#(シャープ)」をそれぞれHTMLタグの後ろにつけることで作成できます。
「.」や「#」を連続することで複数のクラス名やID名をつけることができます。

また、HTMLタグ無しでクラス名やID名を記述するとdivタグになります。
(divタグの省略記法)

“`haml:haml
%div.class-name
%div#id-name
%div.class1.class2.class3
.no-html-tag
#no-html

元記事を表示

【heroku】ActiveRecord::IrreversibleMigration が出たときの対処法

nemlog検索サイト https://searchnemlog.herokuapp.com/
作成の時herokuデプロイで詰まってしまったので解決方法をメモしときます。

#ActiveRecord::IrreversibleMigration
おそらくスクレイピングを通してデータベースに保存していたので起きてしまったエラーと思われます。

以下からはこのエラーの解決手順を記したいと思います。

#ロールバック
“`
heroku run rake db:migrate:reset
“`

恐らくエラー文が表示されると思います。

そこに

“`
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
“`

と書かれていたらそれを利用してDB生成が可能になります。

#ドロップ

“`
heroku run RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop
“`

先ほどのエラー文を利用してドロップするとなんとかドロ

元記事を表示

bin とは

binファイルとは?
binとはbinaryの略で、binファイルとは
テキスト形式ではなくバイナリ形式で書かれているデータを扱うファイル。

バイナリデータとは、コンピュータが理解するためのプログラムが書かれたデータのことである。

元記事を表示

SSH認証するための鍵をBitbucketに設定する。

##そもそも鍵とは…
そもそも鍵はなぜ必要なのか。
リポジトリにアクセスするために、SSH認証キーを使う。
SSH認証することで、
・セキュリティ向上(言わずもがな)
・アクセス時に毎回パスワードを聞かれなくてストレスフリー
私が今回この記事を書こうと決めたのは、パスワードを毎回聞かれ、
ストレスがやばかったから。
では、そのSSH認証するための鍵の生成について見ていきましょう。

***
#SSH認証するための鍵をBitbucketに設定する
1.SSH認証の公開鍵/秘密鍵を作成
2.公開鍵をクリップボードにコピー
3.Bitbucketに公開鍵を登録

***
###SSH認証の公開鍵/秘密鍵を作成
ターミナル上で以下コマンドを叩いて、公開鍵と秘密鍵を生成。

“`Bash:bash
$ cd ~/.ssh
$ ssh-keygen -t rsa -C hoge@example.com # 自分のメールアドレス
“`
以下コマンドを叩いて、生成されたファイルを確認。

“`Bash:bash
$ ls -l
合計 12
-rw——- 1 hoge 1831

元記事を表示

rails_same_site_cookie gemで、RailsアプリにChrome 80向けのSameSite属性を指定する

## はじめに

以下の記事にあるとおり、Chrome 80では2020年2月17日の週以降にデフォルトのSameSite属性が変更されます。

[Chrome 80が密かに呼び寄せる地獄 ~ SameSite属性のデフォルト変更を調べてみた – Qiita](https://qiita.com/ahera/items/0c8276da6b0bed2b580c)

この変更が入ると、次のように「決済や認証などで外部サービスを利用し、外部サイトからPOSTで戻ってくるサイト」でユーザーが識別できないエラーが発生します。

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_117852_84f60298-2a3f-65b0-5ff6-daacf12a1c4b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/c9bcba25-0e88-37d0-ef02-26ed9ba71a2f.png)
(画像の引用元:[Chrome 80が

元記事を表示

JavaScript上でObjectをRailsで取得できる形のFormDataへ変換する

# 概要
TypeScript上で、`File`を含んだObjectをRails APIにputやpostしたい。
→ そのままだと`File`がうまく渡らないので`FormData`にする必要がある。
→ `File`以外のパラメータも含んだ`Object`を`FormData`に変換したい。

# コード
“`ts
/**
* Convert object to FormData which rails can use.
* This function is useful for uploading files.
*
* ex)
* { id: 1, hero: { id: 1, name: ‘NewHero’ }, items: [1, 2] }
* -> FormData with following parameters
* id: 1
* hero[id]: 1
* hero[name]: NewHero
* items[]: 1
* items[]: 2
*
* @param params
* @return FormData
*/
exp

元記事を表示

【Rails】ActiveRecordの`find_by`で大文字と小文字を区別しないで取得する方法

## はじめに

`find_by`メソッドで値を取得する際にハマったので解決方法を探してみました。

Rails : 6.0
Ruby: 2.7
SQLite3

以上の環境しか確認していません。

## 検索対象と検索したい文字列を大文字に変換

保存されたタグを取得する際、大文字と小文字の違いで期待した値を取得することができない。

“`bash
$ rails console
# 大文字と小文字を混ぜた状態で保存します
> Tag.create(tag_name: “RuBy”)
>
# 小文字で先程作成したタグ名を検索してみます
> Tag.find_by(tag_name: “ruby”)
#=> nil
“`

Tags テーブルに保存された値は`”RuBy”`と保存しているため`find_by`メソッドで`”ruby”`と検索しても取得することができません。

ユーザーがタグを検索したい場合、`”ruby”`や`”Ruby”`、`”RUBY”`など様々な入力で検索する可能性があるため、大文字と小文字で区別されてしまうのは不便です。

元記事を表示

factory_botでモデルのenum別のtraitを一発で書く小ネタ

image.png

今回はRailsでテストデータを作成する”**factroy_bot**”に関する小ネタです。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110571/b8ce74c2-4061-a434-7075-384012768b56.png)](https://github.com/thoughtbot/factory_bot)

# TL DR;
こんな感じでイケちゃう

“`rb
User.account_type.values.each do |type|
trait :”#{type}” do
account_type { type }
end
en

元記事を表示

Railsでbundle installができない

#問題
`bundle install`をすると

Installing mysql2 0.5.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
(略)
An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v ‘0.5.2’ –source ‘https://rubygems.org/’` succeeds before bundling.

と出る

指示通り
`gem install mysql2 -v ‘0.5.2’ –source ‘https://rubygems.org/’`
を走らせても解決しない

#解決策
`bundle config`を実行すると

build.mysql2
Set for your local app (/Users/ユーザー名/アプリ

元記事を表示

【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

元記事を表示

OTHERカテゴリの最新記事