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

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

rails: will_paginateを共通化してみた

### 前提
※ 本投稿では“will_gaignate“の使い方の解説はしません
でも、間違ってアクセスしてきた人のためにREADMEのリンクだけ添付しておきます。
[will_paginate](https://github.com/mislav/will_paginate/blob/master/README.md)

### 何をしたいのか
“will_paginate“はとても便利な“gem“ですが、実際に使うとコード一行が長くなりがち。
“paginate“に加えて、他のメソッドも呼び出したりしていると、“rubocop“にLine is too longに怒られる可能性がある。
“paginate“で、“per_page“を設定することはあっても、“page“を設定しない場合がある。
なので、もっとシンプルに出来ないかを僕なりの方法で以下のようにしてみた。

### 解説
1. “concerns“の中で共通モジュールを作成する
2. モジュールの中で“WillPaginate::ViewHelpers“を読み込む
3. “sco

元記事を表示

Dockerで環境構築する際、ソースコードの変更が即時反映されない場合の対処法

##記事の目的
docker-composeで環境構築する際に起こったRailsのソースコードを修正しても即時反映されない問題に対しての対処法を共有すること。

## 対処法

###1.development.rbを編集

開発環境用の設定ファイルである “`config/environments/development.rb“` を編集。
「 ~ 」は元々の記述を省略しているものとする。
この中に“`config.reload_classes_only_on_change = false“`という記述を追加する。

“`development.rb

Rails.application.configure do

~
config.reload_classes_only_on_change = false

end

“`
###2.railsコンテナを再起動

設定を記載しただけでは反映されないので、最後にRailsを再起動する。

ターミナル上で、

“`
$ docker-compose restart
“`
と入力する。

以上でソースコードの変

元記事を表示

#Rails + #MySQL / begin rescue end と Transaction を外側・内側に置いた動作の違いを確認してみたコード断片ですが

– Transactionの中で エラーが発生した場合、後続の処理を続けずに ROLLBACK させ、なおかつエラーをハンドリングして特定の処理をおこないたい
– Transaction で begin rescue end で囲ってしまうと、特定のエラーを rescue するときに、ROLLBACK を発生させるための例外も起こらなくなってしまい、やりたいことが出来ない
– Transaction を内側に、begin rescue end を外側に書いてみる。こうすることで ROLLBACK が起こった後に 例外をキャッチして、特定のエラーハンドリング処理をおこなうということを実現する

“`rb
class User < ApplicationRecord validates_uniqueness_of :unique_id end ``` ```rb def call_inner_transaction(id: , something_wrong: false) begin ActiveRecord::Base.transaction do St

元記事を表示

#Rails + #MySQL / ApplicationRecord.transaction / begin rescue end / COMMIT or ROLLBACK / raise in Inner or outer Transaction / Ruby examples

“`rb
class User < ApplicationRecord validates_uniqueness_of :unique_id end ``` # I HOPE IT ```rb def call_inner_transaction(id: , something_wrong: false) begin ActiveRecord::Base.transaction do StripeWebhookSucceededEvent.create!(unique_id: id) raise 'SOMETHING WRONG' if something_wrong puts '-' * 100 puts 'EXECUTED!' puts '-' * 100 end rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotUnique => e
puts ‘*’ * 100
puts “RAISED!”
p

元記事を表示

【第8章】Railsチュートリアル 5.1(第4版) 基本的なログイン機構

大まかな流れの自己整理が目的(コード外文章中のSession(s)の表記などはスルー状態)のため、内容そのものに不足・誤り等あれば追記&訂正していきますのでご指摘頂けますと幸いです:bow_tone1:
なお、筆者は[YassLabさんの動画版](https://railstutorial.jp/#screencast)で学んでいるため、本記事は「チュートリアル sample_app」+「他補足」~~個人的に「電子ページ以上に分かりやすい!」と感じた解説部分+参考記事を整理してみようと試みた劣化~~の内容寄りになってます。

#8.1 セッション
##セッション(Session)とは
ユーザがログイン後、ページ遷移しても再度ログインしなくてもいいように、「ログインしている」ことを記憶しておく機能のこと。
ページを移動しても変数の内容を保持する仕組みなので、ログイン機能以外でも利用可能。

###Sessionsリソース
「ログインしているかどうか?」が知りたく、いちいちDB書き換えは面倒…
→ 今回はモデル(兼DB)は使わない!
Sessionやrailsサーバに一時的に情報を保

元記事を表示

[Rails]form_withでutf8=✓を消す方法

調べても中々なかったのでメモ

## form_withでutf8=✓を消す方法

“`haml
= form_with(url: hoge_path, method: :get, local: true, skip_enforcing_utf8: true)
“`

`skip_enforcing_utf8: true`を指定する。

### form_for / form_tagだと

`enforce_utf8: false`

## 参考情報

– https://github.com/rails/rails/pull/26976/commits/15a805c38059a951c5fba1f6bc9281d6707fed4e#diff-05817d325a286d1a910b60604c35d3e3R692
– https://qiita.com/tyamagu2/items/fbc44f7b41a1697ca5b7

元記事を表示

[Rails]Deviseの有効期限設定する方法

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです!

#URLの有効期限
設定ファイル `config/initializers/devise.rb` を編集

“`config/initializers/devise.rb
Devise.setup do |config|
# 省略
config.confirm_within = 1.minutes
# 省略
end
“`
この記述内容はアカウントを登録してから
・1分以内なら確認化
・1分以降なら確認不可
になる設定ができる!

#参考記事
・[Deviseの有効期限設定をテストする](https://pinzolo.github.io/2015/12/10/testing-devise-timelimits.html/)
・[【Rails】deviseでURL認証付きのメールを送信してみる](https://qiita.com/ozackiee/items/21fcad4

元記事を表示

#Rails + #MySQL / Transaction と INSERT RECORD と ROLLBACK で排他制御の実験

# パターン1 – プロセスA

INSERTのあと、しばらく後続の処理が続くが、最後には失敗するケース
Transaction内の処理が失敗してロールバックする

“`
ActiveRecord::Base.transaction { User.create!(unique_id: ‘X1’); sleep 15; raise; }
# (0.7ms) BEGIN
# User Create (0.9ms) INSERT INTO `users` (`unique_id`, `created_at`) VALUES (‘X1’, ‘2020-01-09 08:18:34’)
#
# … wait …
#
# (10.4ms) ROLLBACK
# from (pry):14:in `block in


“`

# パターン1 – プロセスB

プロセスAのTransaction内での処理と重複するレコードをINSERTする
プロセスAの処理が失敗するのを待ってからコミットされ、さらに後続の処理が開始・成功する

“`
ActiveRecord

元記事を表示

#Rails + #MySQL / Transaction & INSERT RECORD & ROLLBACK / Lock and wait example

# Pattern1 – ProcessA

“`
ActiveRecord::Base.transaction { User.create!(unique_id: ‘X1’); sleep 15; raise; }
# (0.7ms) BEGIN
# User Create (0.9ms) INSERT INTO `users` (`unique_id`, `created_at`) VALUES (‘X1’, ‘2020-01-09 08:18:34’)
#
# … wait …
#
# (10.4ms) ROLLBACK
# from (pry):14:in `block in


“`

# Pattern1 – ProcessB

“`
ActiveRecord::Base.transaction { User.create!(unique_id: ‘X1’); puts ‘OK!’; }
#
# (0.5ms) BEGIN
#
# … wait …
#
# User Create (2573.1ms) INSERT INT

元記事を表示

【rails】Ajaxを使ったフォローボタンの実装で躓いたところ

#はじめに

初学者がポートフォリオ作成の際に躓いたことをメモします。
今回は躓いた部分だけ記載します。全体を知りたい方は下記のリンクがわかりやすいです。
https://railstutorial.jp/chapters/following_users?version=4.2#sec-a_working_follow_button_the_standard_way
https://qiita.com/Kaisyou/items/e918b77465e3f55c97a2

##Ajaxとは
『Ajaxとは、あるWebページを表示した状態のまま、別のページや再読込などを伴わずにWebサーバ側と通信を行い、動的に表示内容を変更する手法。ページ上でプログラムを実行できるプログラミング言語JavaScriptの拡張機能を用いる。』

簡単に言うと、『javascriptによって必要な部分だけを更新する技術。その為ページ全体を再読み込みする必要がなく、素早いレスポンスが可能になる』と言ったところでしょうか?

##前提
今回はユーザー一覧画面(users/index)でフォローボタンを表示しま

元記事を表示

アイデアは早めに形にした方がいいぞ!2020

# アイデアは早めに形にした方がいいぞ!2020

似たような内容の記事は探せば5万と出てくると思います。
私もインターネットをクロールしているときに見たことがある気がします。

ですがそういった歴史上の出来事がすっかり頭から抜け落ちていた私は、どちらかといえば経験から学ぶタイプ、つまり愚者側の人間だったためこのような事態になってしまいました。

今後このようなことがないよう戒めのために記録を残しておくことにします。
読み物と思って見ていただければ感激です。

## :bookmark_tabs: TL;DR
アイデアは早い段階で形にしたほうがいいぞ!

## :house: 前書き
令和時代になった今、AWSをまともに触っていないのは自分だけなのではないかと思い、何かしらのWebアプリケーションをデプロイしてみようと思った9月の秋が始まりである。

## :wrench:何を作った?
動画の切り抜きをシェアするWebアプリを開発した。
個人的にめちゃくちゃ欲しかった。

スクリーンショット 2020-01-08 13.16.11.png

元記事を表示

【Rails】アカウントをアクティベート

– あらかじめDBには有効化されていない状態のレコードがある
– 顧客ID、メールアドレス、電話番号を入力すると有効化メールが送信される
– リンクを踏んで有効化、ユーザー情報更新、ログイン

という流れを実装したのでまとめます。

##前提
– customersテーブルには`activation_digest`、`activated_at`の2つのカラムが必要(無い場合は追加)

##Model
– `attr_accessor`で`activation_token`属性を有効化
– トークンとダイジェストを生成、代入するメソッドを作成
– 引数にトークンを取って、ダイジェストと比較するメソッドを作成

“`app/models/customer.rb
class Customer < ApplicationRecord attr_accessor :activation_token . . # 引数のハッシュ値を返す def self.digest(string) cost = ActiveModel::SecurePassword.min_cost ? B

元記事を表示

bundle installするときに “can’t find gem bundler (>= 0.a) with executable bundler (Gem::GemNotFoundException)” とErrorが出る

# 問題が起きたらググれって偉い人が言ってた

対象のディレクトリ下でbundle installするときに起った現象のメモ
※初学者なので細かめに記載

git cloneしたアプリのgemを入れようとしたら以下のエラーが出た。

“`ruby:console
Traceback (most recent call last):
2: from /Users/mac/.rbenv/versions/2.5.3/bin/bundler:23:in `


1: from /Users/mac/.rbenv/versions/2.5.3/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path’
/Users/mac/.rbenv/versions/2.5.3/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe’: can’t find gem bundler (>= 0.a) with executable bundler (Gem::GemNotFoundExcept

元記事を表示

モデルのテストの記述方法を細かくみてみた

下記のようなテスト文を、後からわかりやすいように、細かくみてみた。

“`ruby:spec/models.rb/message_spec.rb
require ‘rails helper’

RSpec.describe Message, type: :model do
describe ‘#create’ do
context ‘can save’ do
it ‘is valid with content’ do
expect(build(:message,image: nil)).to be_valid
end
end

context ‘can not save’ do
it ‘is invalid without content and image’ do
message = build(:message, content: nil, image: nil)
message.valid?
expect(message.errors[:c

元記事を表示

Railsでカンマ区切り+小数点以下表示で数値を出力する方法

# 目的
整数部をカンマ区切りで表示し、小数点以下を表示したい

# コード
“`rb
number_with_precision(123456789, precision: 2, delimiter: ‘,’)
#=> “123,456,789.00”
“`

# 参考リンク
[ruby-on-rails — 大きな数字にカンマを追加するためのRailsトリックはありますか?](https://www.it-swarm.net/ja/ruby-on-rails/%E5%A4%A7%E3%81%8D%E3%81%AA%E6%95%B0%E5%AD%97%E3%81%AB%E3%82%AB%E3%83%B3%E3%83%9E%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AErails%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F/967301

元記事を表示

【Rails】has_secure_passwordメソッド

has_secure_passwordメソッドについてのメモです。

準備

usersテーブルにpassword_digestカラムを追加しておく。

bcryptをインストールする。

“`ruby:Gemfile
gem ‘bcrypt’
“`
“`bash:ターミナル
$ bundle install
“`
モデルに`has_secure_password`を記載する。

“`ruby:app/models/user.rb
class User < ApplicationRecord has_secure_password end ``` 機能 - - 暗号化されたパスワードがpassword_digestカラムに保存される。 - 仮想属性`password_confirmation`を使用して、入力ミスを減らすためにパスワードの確認入力をさせることができる。 - authenticateメソッドを使用して、メールアドレスとパスワードに基いてユーザー認証を行うことができる。

元記事を表示

Railsアプリケーションのメモリが膨れ上がる問題

次のグラフは、Herokuで運用している、とあるRailsアプリケーションのMemory Usageです。1日1回再起動がかかったあと、スワップが発生するまでメモリ使用量が増え続けます。特に大きなデータをメモリ上に置き続けているわけではありません。

![memory-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308595/e66cace3-badf-7916-099b-900f3a04e09d.png)

Passengerの作者Hongli Lai氏が、Rubyのメモリが膨れ上がる問題について研究して記事を書いています(2019年3月)。

– [What causes Ruby memory bloat? – Joyful Bikeshedding](https://www.joyfulbikeshedding.com/blog/2019-03-14-what-causes-ruby-memory-bloat.html)

日本語での概略は、次の記事の真ん中あたりで読めます。

– [Eu

元記事を表示

rails usersテーブルの値をpasswordなしで更新する

##はじめに
Userテーブルのカラムを**passwordなし**で更新しようと思ったときに、更新ができずに手間取ってしまったのでその備忘録として記載する。

##概要
usersテーブルに**profile**というカラムを持たせていたのだが、**ユーザー登録後**にユーザーページからユーザー情報を更新したい。

##ぶつかった課題
controllerで以下のように定義して実行した際にRollbackが起こり、値が更新されなかった。

“`ruby:mypage_controller.rb
class MypageController < ApplicationController # 途中略 def update user=User.find(current_user.id) #パスワードなしでのプロフィールの変更 user.update_without_password(nickname:params[:mypage][:nickname],profile: params[:mypage][:p

元記事を表示

【Rails】redirect_toで変数を渡す

`redirect_to`でページ遷移する先に、変数を引き渡す方法がわかったのでメモ。

###送る側
“`rb
redirect_to hoge_url(user_id: @customer.id)
“`

###受け取る側
“`rb
user_id = params[:user_id]
“`

元記事を表示

Railsで開発した個人アプリにDockerを導入する手順と最低限の知識

Railsで開発した個人アプリに、後からDockerを導入しました。
その時知識不足なせいでハマってしまった場面があったので、自分の中で整理してアウトプットすることを目的にこの記事を書き残します。

ちなみに、以下の記事を主に参考にさせていただきました。
[DockerをMacにインストールする](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)
[Docker + Rails + Puma + Nginx + MySQL](https://qiita.com/eighty8/items/0288ab9c127ddb683315)

# RailsアプリにDockerを導入する手順+事前知識
まずは事前知識として、これは知っておいたほうがいいというものを簡単に書いていきます。

## 事前知識 – Docker関係

### Docker(ドッカー)

※1.軽量な仮想化環境を実現するためのツール。

OS やアプリケーションを設定したものを丸ごと実行イメージとして保存できるので、Docker が導入されている別のマシンにそ

元記事を表示

OTHERカテゴリの最新記事