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

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

本番環境のコマンドを開発環境で実行してしまった場合の対処

#はじめに
今回は本番環境で行うコマンドを間違って開発環境で実行してしまいエラーが発生してしまったのでそうなってしまった理由や原因を調べていきます。

##やってしまったこと
AWSでEC2のサーバーを立ち上げるために以下のコードを誤って開発環境で実行してしまった…

“`
$ bundle install –path vendor/bundle –without test development
“`

そこから`bundle install`やサーバーを立ち上げようとするとエラーが発生するようになりました。

bundle installで`Nokogiri`がインストールできないエラー

“`
Gem files will remain installed in
/home/vagrant/work/SMB/vendor/bundle/ruby/2.5.0/gems/nokogiri-1.10.9 for inspection.
Results logged to
/home/vagrant/work/SMB/vendor/bundle/ruby/2.5.0/ext

元記事を表示

【エラー】Postgres PG::ConnectionBad: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket “/tmp/.s.PGSQL.5432”?【Rails】

“`brew install imagemagick“`した後にサーバーを立ち上げると下記のエラーが。![スクリーンショット 2020-11-22 午前8.59.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692366/8a1c735d-a751-773a-44d6-3be72532e0cb.png)

#したこと
とりあえずhttps://qiita.com/great084/items/98c83364f246473249c4 を参照。
しかしエラーは解決せず。

“`
postgres -D /usr/local/var/postgres 
2020-11-21 23:37:47.476 AEDT [84006] FATAL: database files are incompatible with server
2020-11-21 23:37:47.476 AEDT [84006] DETAIL: The data directory was initialized by

元記事を表示

Rails で既存カラムにdefault オプションを追加したい

# はじめに

Rails で既存カラムのdefault オプションを追加したい場面があったので備忘録です。

# 環境

* macOS 10.15.6
* Ruby 2.5.7
* Rails 5.2.3

# 参考URL



# 目標

* 既存カラムにdefault オプションのみ変更したい
* きちんとロールバックできるmigration ファイルを作成したい

# ロールバック用のメソッドについて

* `up/down` メソッド
* `change` メソッド

上記の2つのパターンでmigration ファイルを記述できますが、オプションの変更のみであれば`change` メソッドの方がシンプルでロールバックも可能ということな

元記事を表示

【Rails】でデータを保存・更新後に直前のページに戻りたい!

# はじめに
たとえばECサイトの購入ページからユーザー情報を更新した後、トップページに飛ばされたらどうでしょう?
ユーザーはまた購入画面にアクセスし直さなければならず、かなりUXが悪い状態になってしまいます。


そこで、元の購入ページへ戻す方法を調べてみました。

# 直接指定すれば良いのでは?
もちろんページ同士が1対1の関係にある場合はこれでOKです。

しかし、ユーザー情報の更新などは他のページからも行えるようにしたいですよね。
ページの関係が多対1の場合、リ

元記事を表示

一意性制約のバリデーションをかける方法

#一意性制約とは
 同じデータを保存することができないようすること。

##マイグレーションファイルに一意性制約

“`ruby
def change
create_table :schools do |t|
t.string :name, null: false
t.timestamps
end
add_index :schools, :name, unique: true
end
“`
`add_index :schools, :name, unique: true`←この部分が一意性制約
       テーブル名, カラム名

##モデルに一意性制約

“`ruby
validates :name, presence: true, uniqueness: { case_sensitive: false }
“`
`uniqueness: { case_sensitive: false }`←この部分が一意性制約
`case_sensitive: false`は大文字・小文字を判別するかどうか。

##終わりに
マイグレーシ

元記事を表示

開発未経験のテストエンジニアがRailsで自動テストをやってみた

私は、テストエンジニアとして働いています。
業務経験としては、業務系システムのテスターが1年3か月、
進捗管理が2か月程です。

私の技術的な強みが、
少しSQLが得意なこと以外に思い浮かばないのに危機感を感じ、
10月からRailsを使った個人開発を自己研鑽として行っています。
(SQLの知識としては、オラクルマスターブロンズ合格程度です。)

そんな私が、Railsでテストを書いてみて、
手動テストとの比較を記事にしてみました。

自動テストの魅力

大きく分けて以下の2つのメリットを感じました。

・テスト実行が楽
・テストを先に書くことで、仕様の整理ができる

テスト実行が楽

何と言っても、テスト実行が楽です。
ひとたびコードを書いてしまえば、
“rails t”というコマンド一行でテストを実行できます。

きちんとテストが書けていればという前提ですが、
本番環境へのデプロイ前に、先述のコマンドを打ち込めば、
正常にアプリケーションが動くかどうかが確認できます。

また、手動テストでExcel方眼紙にスクリーンショットを貼り付けて
エビデンスを

元記事を表示

【Rails】7つのアクション以外のアクションを追加する

オリジナルのメモ投稿アプリの作成中、過去のメモを表示させるViewを追加で作成したいと思ったのですがデフォルトで作成される7つのアクションは既に作成しており、何か方法がないか調べ実装できたことをメモしておきます。
### 解決策
1. Controllerに新たなアクション(今回は past というアクション名にしました)を定義
2. past.html.erbを作成
3. ルーティングにpastを追加する

ルーティングの記述は下記の通り

“`routes.rb
resources :schedules do
get “past”, on: :member
resources :comments, only: :create
end
“`
rails routesで確認するとURIパターンは下記の通り確認できました。

“`
schedules/:id/past(.:format)
“`

### 参考サイト
[Railsのルーティング](https://railsguides.jp/routing.html)
[作って学ぶRuby on

元記事を表示

railsのメソッド”save”がどう定義されているのか読解してみた

rails読解シリーズ第5回目はsaveメソッド。

“`ruby:save
# File activerecord/lib/active_record/base.rb, line 2575
def save
create_or_update
end
“`
create_or_updateメソッドが呼ばれているだけのようです。

“`ruby:create_or_update
# File activerecord/lib/active_record/base.rb, line 2916
def create_or_update
raise ReadOnlyRecord if readonly?
result = new_record? ? create : update
result != false
end
“`

2行目で、対象のインスタンスが読み取り専用かどうか確認するようです。
メソッドの名前からして、readonly属性はboolean型で定義して、readonly: trueとすることで、利用することができそうです。
プログラマーが自ら定義するこ

元記事を表示

Railsチュートリアルエラー :FormatError: fixture key is not a hash

#エラーの発生!

Ruby on Rails チュートリアル 第6番
“リスト 8.24: 有効な情報を使ってユーザーログインをテストする”
を進めていると。。。。

今まで通っていたテストが全てエラーに!!

“`
21 tests, 0 assertions, 0 failures, 21 errors, 0 skips
“`

しかし、よくよくエラーを確認すると…

“`
ActiveRecord::Fixture::FormatError: fixture key is not a hash:
/home/ubuntu/environment/sample_app/test/fixtures/users.yml
“`
fixturesフォルダの中のusers.ymlに原因があると判明。

調べてみると、ymlではインデントも意味をもつとのこと。

【参考】
https://teratail.com/questions/263996

/home/ubuntu/environment/sample_app/test/fixtures/users.ymlを
下記のよ

元記事を表示

ポートフォリオにTwitterAPIを使ってツイートする機能を実装する(アカウント申請した後の流れ)

Ruby on Railsで製作したポートフォリオ(ダイエットアプリ)にTwitterAPIを連携させて、ポートフォリオで投稿すると、Twitterにツイートされるような設定を行いました。

# やりたいこと
ポートフォリオのアプリで投稿すると、Twitterで「投稿しました」とツイートされるようにしたい。
Railsで投稿系のアプリを作っている方で、「Twitter APIと連携させたい」と思っている方の参考になれば幸いです。

ちなみに、deviseと連携してTwitterログイン機能を実装されている方もいますが、僕はまだそれはやっていません。

# TwitterAPIと連携させる手順
① TwitterAPIに自分のアプリの登録手続きを行う
② Twitter developerアカウントでAPI key(Consumer Key)、API secret key(Cosumer Secret)、Access token、Access token secretの4つを取得する
③ TwitterAPIに書き込み権限を許可する
④ gem ‘twitter’を`$ bundle i

元記事を表示

railsのgem deviseのログインページを開くコントローラを読解してみた

rails読解シリーズ、第4回はdeviseのコントローラを読解してみました。
いつも深入りしすぎて、全体像が見えづらくなっているので今回はあっさりめに読んでみました。

ログインページを開くための、session#newアクションを見ていきます

“`ruby:session#new
def new
self.resource = resource_class.new(sign_in_params)
clean_up_passwords(resource)
yield resource if block_given?
respond_with(resource, serialize_options(resource))
end
“`

“`ruby:2行目
self.resource = resource_class.new(sign_in_params)
“`
resource_classによってdeviseを適用しているモデル、例えばUserモデルが呼ばれます。
sign_in_paramsによりストロングパラメータを通した値が、Userモデルに格納されま

元記事を表示

railsで”Model.new”が呼ばれるとどうなるか読解してみた

railsメソッドがどのように定義されているのか学んでいく企画第3弾はモデルからオブジェクトを生成する[newメソッド(Rails APIリンク)](https://api.rubyonrails.org/v5.1.7/classes/ActiveModel/Model.html#method-c-new)です。

実際にはnewメソッドはRubyで定義されています。
ので、正確にはタイトルの通り、railsのActiveModelによって定義されるモデルのインスタンスをrubyで定義されているnewメソッドが呼び出して生成したときに何が起こるか、について見ていきます。

“`ruby:new
class Person
include ActiveModel::Model
attr_accessor :name, :age
end

person = Person.new(name: ‘bob’, age: ’18’)
person.name # => “bob”
person.age # => “18”
“`

#newメソッドが呼ばれたら?
newメソッドによりインス

元記事を表示

Rubyでロックファイルによる簡易的排他制御

冪等性がないやアクセス制限などの理由で、同時実行不可という要望はしばしば出てきます。普段ではデータベースに実行フラグを置いたり、RedisやQueueで制御したりするのが一般的ですが、どれも実装コストが高くて、小規模プロジェクトにはコスパがやや高いと思います。
ロックファイルで制御を行えば、データベースの変更などが不要で、手軽いに排他制御ができます。

# TD;LR

“`rb
require ‘fileutils’
DIR_NAME = ‘tmp/locks’

# 排他制御用ラッパー
def synchronized(key = :default_lock)
# フォルダーがない時エラーが生じるので、あらかじめ生成しておく
FileUtils.mkdir_p(DIR_NAME)
lock_file_path = “#{DIR_NAME}/#{key}”
File.open(lock_file_path, ‘w’) do |lock_file|
# 排他ロック
if lock_file.flock(File::LOCK_EX|File::LOCK_

元記事を表示

「もっと見る」でページネーションを非同期(Ajax)で実装する

# はじめに

## やりたいこと

「もっと見る」を押すことで次の記事が出るようにしたい

## やってみて

JavaScriptが苦手な僕でも、簡単に実装することができました。
今回はjQueryで実装しています。

### 実装画面

![画面収録 2020-11-21 15.56.42.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771826/ff8f2862-7edb-8cde-8306-d98b52557134.gif)

### 実装例
[Output App](https://outputapp.herokuapp.com)

## 参考
[kaminari徹底入門](https://qiita.com/nysalor/items/77b9d6bc5baa41ea01f3)
[t-taira blog > ailsで「もっと見る」の実装]( http://t-taira.hatenablog.com/entry/2013/04/05/093714)

***※情報のソースが古

元記事を表示

Railsを使ったToDoリストの作成(8.ログイン機能の実装)

#概要
本記事は、初学者がRailsを使ってToDoリストを作成する過程を記したものです。
私と同じく初学者の方で、Railsのアウトプット段階でつまづいている方に向けて基礎の基礎を押さえた解説をしております。
抜け漏れや説明不足など多々あるとは思いますが、読んでくださった方にとって少しでも役に立つ記事であれば幸いです。

#環境
* `Homebrew: 2.5.10` -> MacOSのパッケージ管理ツール
* `ruby: 2.6.5p114` -> Ruby
* `Rails: 6.0.3.4` -> Rails
* `node: 14.3.0` -> Node.js
* `yarn: 1.22.10` -> JSのパッケージ管理ツール
* `Bundler: 2.1.4` -> gemのバージョン管理ツール

“`:iTerm
$ brew -v => Homebrew 2.5.10
$ ruby -v => ruby 2.6.5p114
$ rails -v => Rails 6.0.3.4
$ npm version => node: ‘14.3.0’
$ yarn –

元記事を表示

hidden_field と hidden_field_tag 備忘録

“`ruby:
<%= form_with(model: @comment, local: true) do |f| %>
<%= f.hidden_field :post_id, value: @post.id %>
<%= f.text_field :content %>
<% end %>
“`

“`ruby:controller
# 受け取り方
class CommentsController < ApplicationController def create @comment = Comment.new(comment_params) @comment.user_id = current_user.id if @comment.save redirect_back(fallback_location: root_path) else @post = Post.find(params[:post_id]) @comments = @post.comments render 'p

元記事を表示

ActiveSupport::Concernでクラスメソッドを定義して、さらにクラスメソッドを呼び出せるのか

こちらの記事を参照して、

https://qiita.com/h-shima/items/d772b4cbe7368ddb8255

modelにインクルードすることによりConcernでクラスメソッドを定義できることがわかったのですが、そのクラスメソッド内でさらに**モデルに定義したクラスメソッドが呼び出せるか**検証しました。

####concern内でクラスメソッドを呼び出す
“`ruby:app/models/concerns/hogehoge.rb
module Hogehoge
extend ActiveSupport::Concern

module ClassMethods
def my_class_method
puts(“実行結果”)
self.model_class_method(“model_class_method”)
puts(“my_class_method”)
end
end

end
“`

####モデルを定義
“`ruby:app/models/concerns/mode

元記事を表示

letとlet!の使い分け(Ruby/Rspec)

letとlet!の使い方ではまったので備忘録として残します。

letとは

letはインスタンス変数やローカル変数をletという機能で置き換えることができます。

ex)
@user = user.create
let(:user) { create(:user) }

letを使うと何が嬉しいかというと、テストコードがすっきりするというのと
letはその変数が必要になるまでは呼び出されないという遅延評価されるという特徴があるため、効率のよいテストコードを作成できることです。
beforeを使うとブロックの宣言時に全ての変数が評価されるため、
使用していない変数があったとしても評価されてしまい
あまり効率のよくないテストコードになってしまうことがあります。

let!は基本的にはbeforeと同じ意味になります。
つまりテストを実行する上で前提条件にあたる部分はletではなくlet!で記載してあげる必要があります。

ex)
before do
@user = user.create
end
let!(:

[Rails]ゲストログイン機能

# はじめに
ポートフォリオにゲストログイン機能があった方が良いとのことだったので実装してみました。

# 目次
- 1. ルーティング
- 2. コントローラー
- 3. モデル
- 4. ビュー

# 1. ルーティング
routes.rbにゲストログイン用のアクションを設定します。
deviseのsessionsコントローラーに新しくメソッドを追加しています。

```ruby:config/routes.rb
Rails.application.routes.draw do
devise_for :users
devise_scope :user do
post 'users/guest_sign_in', to: 'users/sessions#new_guest'
end
~略~
end
```

# 2. コントローラー
controllersの中にusersフォルダを作成しsessions_controller.rbファイルを作成。
new_guestメソッドをコントローラーに作成します。
guestメソッドはモデルに作成します。

```rub

ActionController::UrlGenerationError in CreditCard#new ~~pathをprefixで書いた時のエラー~~

# はじめに
マイページへのリンク先をprefixで書いた時にエラーでつまずいたので記録として残します。
# 実装したこと
hamlの ``= link_to``でurlを``"/users/#{current_user.id}"``で
記載してマイページに遷移するようにしていました。
``"/users/#{current_user.id}"``をprefixの記載に変更するために
rails routesで探しにいきました。
![user:id routes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684702/53e96fa2-bb5a-ac67-1781-c922925b5971.png)
userとなっているので``user_path``として記載しました。
すると下記のエラーが発生。
![UrlGenerationError.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684702/b330b858-