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

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

Rspec の expect と with で ネストの深いハッシュや引数をゆるくテストする / #Ruby #Rspec #Rails

# Complexed hash fuzzy match

“`rb
example ‘complexed match’ do
expect(SomeClass).to receive(:call).with(
‘X’,
hash_including(
y1: ‘Y1’,
y2: (be_a String),
y4: hash_including(
y4_1: array_including(1, 3),
y4_3: contain_exactly(9, 7, 8),
)
),
any_args
)
subject
end

“`

# Example

“`rb
# Doc
# https://relishapp.com/rspec/rspec-mocks/v/3-2/docs/setting-constraints/matching-arguments

class SomeClass
de

元記事を表示

Hamlで式展開するときはイコールとかダブルクォーテーションとかいらんかった

なんかすごい無駄な書き方をしていたことに気づいたので、執筆します。
同じことしている人とかいないとは思いますが…。

# やりたいこと

– `last updated : 2020-01-11 15:00`と出力したい。
– `2020-01-11 15:00` の部分が動的に変わる。

# こう書いてた

“`haml
= “last updated : #{@first_book.updated_at.strftime(“%F %R”)}”
“`

# これでよかった

“`haml
last updated : #{@first_book.updated_at.strftime(“%F %R”)}
“`

# 気づいた経緯

経緯は書かなくてもいいかなと思ったのですが、せっかくなので。

まず、フッターにコピーライトで `© 2019-2020 Yoshida` みたいに出そうとして、
この `2020` の部分を動的にすれば、年明けてもメンテいらねえじゃんとか思ったのがきっかけでした。

それで、以下のように書きました。`get_this_year` はヘルパーで

元記事を表示

aws EC2でのruby 環境構築

#aws での ruby on rails 環境構築メモ

* root ユーザーの切り替え

* git のインストール

“`
$ sudo su –
# yum -y install git
“`

# Rubyに必要なパッケージのインストール

“`
# yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel
“`

# rbenvのインストール

“`
# git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
# cp -p /etc/profile /etc/profile.ORG
# diff /etc/profile /etc/profile.ORG

# echo ‘expor

元記事を表示

[How To]マイグレーションファイルに記載を忘れた!そんなときにマイグレーションファイルを修正するときの方法リスト

RailsをベースにWebページを作成にあたり、モデルを作っていたところ、一部記載を失念してしまい、そのままマイグレーションしてしまいました。。。

そこで、マイグレーションファイルを修正する方法を改めて確認したので、備忘録的に以下に記載します!

#前提条件
今回の説明にあたり、前提条件としてmigrationフォルダ状況を以下を例とします。

“`:db/migrate
migrate
├─ 20200111042708_devise_create_users.rb
├─ 20200111045059_add_nickname_to_users.rb
├─ 20200111055028_create_addresses.rb
“`

#絶対にやっては行けないこと-マイグレーションファイルの削除-
マイグレーションファイルは絶対に削除しないようにしましょう。実行完了後のマイグレーションファイルを削除してしまうと、schema_migrationsと齟齬が生じ問題が生じる恐れがあります。

*schema_migrations:
データベースの変更履歴のようなもので、どのマイ

元記事を表示

rails newを実行しても、構成ファイルが作成されない

Dockerのコンテナ上で`raile new .`を実行しても、本来作成されるはずのファイルやディレクトリが作成されない状況に直面したので、その対処方法について書きます。

Docker以外の環境でも上記の現象は起こりうる可能性があるため、異なる環境で同じよな問題が発生された方にも参考にしていただけるかと思います。

# 環境
– Host OS
– macOS 10.15.3 Beta
– Docker
– version 2.1.0.5
– Docker Image
– ruby: 2.7-slim

# 問題
`rails new .`を実行すると、本来`app`ディレクトリ等が生成されるはずですが、以下のような出力結果がされました。

“`
root@[container_id]:~# rails new ./
create
create README.md
create Rakefile
create .ruby-version
create config.ru
create .

元記事を表示

neo4jrbチュートリアル[rails]

#概要
`neo4j`を`ruby on rails`に導入したので備忘録を残しておきます。
railsアプリのデータベースを`neo4j`の**グラフデータベース**の形式で表現することができます。

#環境構築
基本的に[ドキュメント](https://neo4jrb.readthedocs.io/en/latest/Setup.html)通りに進めていきます。普段はzshを使っているのですが、bashでないと動かないことがあったため、シェルは`bash`とします。rails設定済みの`macOS`のローカル環境に構築していきます。

“` bash
$ rails new myapp -m http://neo4jrb.io/neo4j/neo4j.rb -O
$ cd myapp
“`
gemを追加します。既に`neo4j`のgemはあるはずです。

“`bash:Gemfile
gem ‘neo4j-rake_tasks’
“`

“`
$ bundle install
“`

[Youtubeの動画](https://www.youtube.com/watch

元記事を表示

rails: form_withを使用するとflash.nowとvalidationエラーが表示されない

### なぜform_withを使用するとエラーが吐かれないのか
form_withは“local: false“がデフォルトで設定されている。
デフォルトで“local: false“が設定されていると、ajaxは楽だが、“form_for“や“form_tag“が前世の時代では、ajaxを使用するときは明示的に“local: true“と書く必要があったがrails5から導入されたform_withでは不要になった。
そのため、ajax処理を頻繁に活用するサービスにとっては便利だなメソッドだがデフォルトでajaxモードになっていると今回のような予期しない状況に遭遇する。(出るはずのエラーが表示されないなど)

### 解決方法
上記で、“local:true or false“に触れているので勘のいい人はもう既に気付いてるかもしれないが“form_with“で“flash.now“や“validation“エラ〜メッセージを表示させるためには、“form_with“の中で“form_for“や“form_tag“とは逆に“local

元記事を表示

RailsアプリでCSSの変更が反映されない時の対処【アセットパイプライン】

Railsアプリケーションのレイアウトを修正しても、CSSが反映されない時がある。
そんな時、まずはブラウザのキャッシュを削除するが、それでも反映されないのならアセットパイプラインが原因と考えられる。

CSSなどの静的なファイルは頻繁に変更がされないため、毎回は読み込まれないようになっているらしい。

##開発環境
・Rails 5.2.3
・Ruby 2.5.1
・ConoHa VPS
・CentOS 7.6
・Capistrano3
・Nginx
・Unicorn

##アセットパイプライン

アセットパイプラインとは、JavaScriptやCSSのアセットを最小化または圧縮して連結するためのフレームワークで、アセットの読み込みを高速化するためのもの。
Railsではデフォルトで有効になっている。

##アセットパイプラインの働き
###①変換
Saasで書かれたスタイルシートをCSS形式に変換したり、CoffeeScriptのスクリプトをJavaScriptに変換したりする。
###②圧縮・結合
CSSやJavaScriptの改行や空白を除去してサイズを縮小し(圧縮)、複数のフ

元記事を表示

AWS(Amazon) Cloud9でPostgreSQLを起動しようとしたらpostgresql: unrecognized serviceと表示される問題の解決方法

$ rails new . –database=postgresql

が、まず最初から入っているpg ~>0.18でなく0.21を入れろと怒られます。なので、Gemfileのpgの所を0.21にしてインストールを試みます。しかしlibpq-fe.h..noとエラーがでるので、必要なライブラリをインストールします。

$ sudo yum install postgresql-devel

再度bundle installで無事gemのインストールはできるはずです。

$ bundle install
次にdbを作ります。が、ここでdbと接続できないというエラーが発生する。

$ rails db:create

could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket “/var/run/postgresql/.s.PGSQL.5432”?

これはPostgreSQLが起

元記事を表示

bundleを使ったrailsプロジェクトの初期化

# ruby, railsコマンドのインストール
rubyコマンドも、railsコマンドもprojectで管理したい。[こちら](https://fukatsu.tech/create-rails-new-app#i-3)を参考にした。

“`
$ bundle init
$ vim Gemfile => gem “rails”のアンコメントを外す
$ bundle install –path vendor/bundle
# APIだけでいいなら最後に–apiをつける
$ bundle exec rails new . -B –skip-bootsnap
“`

* vendor/bundle内にrubyもrailsも他のgemも入る。(一回目のbundle installでpathを指定した)。今後はコマンドは`$ rails exec (実行コマンド)`を使う。

* bootsnapはインストールがうまくいかないのでskipした。

# Gitにpush
“`
$ vim .gitignore => /vendor/bundleを追加
$ git add .
$

元記事を表示

AWS EC2でyumが使えない

#1. エラー文
EC2のインスタンス内でyumを使おうとすると以下のエラー文が表示される

“`
One of the configured repositories failed (不明),
and yum doesn’t have enough cached data to continue. At this point the only
safe thing yum can do is fail. There are a few ways to work “fix” this:

1. Contact the upstream for the repository and get them to fix the problem.

2. Reconfigure the baseurl/etc. for the repository, to point to a working
upstream. This is most often useful if you are using a newer
distribution

元記事を表示

[単体テスト]railsのテスト カタカナのテストコードに苦しめられた 結果:全ては勘違いだった

#テスト
モデルのバリデーションテストについて

**内容**
1,Gemをインストール
2,RSpecの設定
3,テストを書く(主にバリデーション)
4,テストを実行
5,各テストの見本コード
6,もっと記述を簡単にするためのGemインストール
7,factorybotの準備
8,factory_botの記法の省略
9,終わりに
参考ページ

##1,Gemfileの下部に追加

“`ruby:Gemfile
gem ‘rspec-rails’

#こちらはもともと記述があるかもしれないので
#重複しないように注意(group :development doのなかに入るようにする)
group :development do
gem ‘web-console’
end
“`
`bundle install`コマンド実行

##2,RSpecの設定
Rspecは設定ファイルを作成する必要がある

“`ruby:ターミナル
$ rails g rspec:install
“`
以下が作成される
**.rspec**
**spec**
**spec/spec_helper

元記事を表示

【Rails チュートリアル】第6章のbcryptがインストールできずにテストで落ちてしまう。。

Railsのチュートリアルの6章を勉強していた時に、bcryptがインストールできなく手間取ってしまったので解決方法を載せておきます。

これ↓
![スクリーンショット 2020-01-11 15.04.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530825/cd838cee-0737-077d-d0c7-a187a4200276.png)

解決方法

1. gem uninstall bcrypt を実行
2. gem uninstall bcrypt-ruby を実行
3. gem install bcrypt –platform=rubyを実行
4. Gemfileにgem ‘bcrypt’, ‘~> 3.1.11’を記載
5. bundle installを実行

少しでも役に立てれば幸いです。

元記事を表示

mac osをcatalinaにしてからbundleもrailsコマンドも効かない

最近macosをcatalinaにしたんですが、その瞬間からbundleコマンドもrailsコマンドも効かずに途方に暮れる。

“`
9): Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (LoadError)
“`
上記エラーばっかり出てくる。

以下のようにすると解決。

“`
$brew uninstall –ignore-dependencies openssl
$brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/30fd2b68feb458656c2da2b91e577960b11c42f4/Formula/openssl.rb
“`

どうやらopensslのversionが問題らしい

参考記事(英語です)
https://forums.meteor.com/t/mongodump-cannot-find-openssl-version-on-macos-catalina/5091

元記事を表示

【Rails】Ajax(非同期通信)でコメント投稿、削除

Railsにおけるコメント投稿、削除をAjaxを用いて実装していきます。

# 環境
`Rails 5.2.3`
`mysql 5.7.28`

#実装
UserモデルとBoardモデル(投稿)は既にあるものとして進めます。

## ER図
![comment_ER図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562358/2cab309f-e855-1e04-fe70-01ae5f045ed6.png)

## Commentモデル作成

“`:ターミナル
$ rails g model Comment body:text user:references board:references
“`

モデルファイルとマイグレーションファイルが作成されるのでそれぞれ記述していきます。

“`ruby:comment.rb
class Comment < ApplicationRecord belongs_to :user belongs_to :board # 追加 valida

元記事を表示

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サーバに一時的に情報を保

元記事を表示

OTHERカテゴリの最新記事