- 1. Rspecの使い方備忘録
- 2. ransackで「SIMILAR TO」正規表現の検索ができるように
- 3. Docker環境でRspec×Capybara×ChromeDriverを動作させる
- 4. Rails6 webpacker使用時 link_toを使ってmethod: :deleteが動かない
- 5. webサーバー Pumaのアーキテクチャと内部実装を読む
- 6. rails resources
- 7. paranoia only_deletedメソッドのクセ
- 8. railsで実装した複数画像投稿機能で投稿された画像にswiperを適用させる
- 9. FactoryBotについて
- 10. rails newするときのoptionなにしたらええんやっけ?となったとき
- 11. railsのバリデーション
- 12. アプリケーションの作成〜立ち上げ
- 13. Model.human_attribute_name(:カラム名)について(Rails)
- 14. Rails で 特定のページに別のレイアウト(デザイン)を指定する方法
- 15. Ruby on Railsでアプリを作ってみよう⑤
- 16. Docker開発環境
- 17. 【Ruby on Rails Tutorial】6章のテストでエラー
- 18. No template for interactive request IdeasController#index is missing a template for request formats: text/htmlというエラーが出た
- 19. Rails RSpecテストを導入しよう!
- 20. 【Docker + CircleCI + Rails】Missing secret_key_base エラー
Rspecの使い方備忘録
#はじめに
Ruby on Rails でポートフォリオ作成中に、現場でのテストはRspecでかかれることが多いと知ったので、自分なりに調べた使い方の概要をまとめておこうと思います。完全初心者が己の独断と偏見で理解していっているので、話半分程度で参考にしてください。#Rspecの導入
数多のわかりやすい記事が転がっているので割愛します。factory_botも一緒に入れておきましょう。#フォルダ構成
案外ここを記述してくれているサイトはありませんでした。私は以下の記事を参照しました。
https://qiita.com/shogo-1988/items/d19cd5068cdeb825176dまとめると、基本的に以下のようなディレクトリ構成になるようです。
spec/models, requests, features, helpers, mailers, systems, …
ただし、これらはおおまかなもので、このあと書きますが実際には他のディレクトリも追加することになると思います。
現在私が使ったディレクトリについて、おおまかなテスト内容をまとめます。
・mo
ransackで「SIMILAR TO」正規表現の検索ができるように
[PostgreSQL SIMILAR TO](https://www.postgresql.jp/document/9.4/html/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP) を使いたかった。
“`ruby:config/initializers/arel_override.rb
module ArelVisitorsPostgreSQLOverride
# https://github.com/rails/rails/blob/v6.0.3.2/activerecord/lib/arel/visitors/postgresql.rb#L29
def visit_Arel_Nodes_Regexp(o, collector)
# op = o.case_sensitive ? ” ~ ” : ” ~* ”
op = ” SIMILAR TO ”
infix_value o, collector, op
end
endArel::Visitors::PostgreSQL.prep
Docker環境でRspec×Capybara×ChromeDriverを動作させる
作成したrailsアプリをDocker環境にのせ、開発環境上で問題なく動作するよう設定しました。
しかし、この状態のままではRspecが正しく動作しなくなっていたため、内容を見直しました。RspecやCapybaraを元々利用していた前提であり、それらの導入については記載しておりません。
また、前回書いたDocker導入記事の続きの記事となります。Dockerについての設定内容はこちらをご参照ください。
[ローカルRails6アプリのDocker環境への移行(ついでにMysql導入) – Qiita](https://qiita.com/ryohei_kh/items/5583e782a81edae21733)##環境
* ruby 2.7.2
* Rails 6.0.3
* Mysql 8.0.22
* rspec-rails 4.0.2
* capybara 3.34.0
* selenium-webdriver 3.142.7##`docker-compose.yml`
元々は`db`と`web`と`webpacker`のみの構成としていましたが、新たにテスト用のD
Rails6 webpacker使用時 link_toを使ってmethod: :deleteが動かない
#問題
rails6でwebpacker使用時に以下のようなlink_to ~~~ method: :deletが機能しない問題。
“`erb
<%= link_to "削除", micropost_path(micropost), method: :delete, data: { confirm: "選択した投稿を削除しますか?" } %>
“`
#メソッドの偽造に影響している箇所
GetメソッドをDleteメソッドに偽造してくれるのは以下の部分が影響している。“`javascript:app/javascript/packs/application.js
require(“@rails/ujs”).start()
“`
#解決方法
自分の場合はそもそもnode_modulesに@rails/ujsが入ってなかった。なので以下のコマンドでデフォルトで書かれている物を追加したら、きっちり削除確認のメッセージも表示されて動きました。
“`
$ yarn add @rails/ujs
“`#追記
Dockerで環境構築してrails webpacker:ins
webサーバー Pumaのアーキテクチャと内部実装を読む
# Pumaのアーキテクチャと内部実装を読む
インターン先のシステムがリプレースされるにあたり、アプリケーションサーバーが`unicorn`から`puma`に変更されることになったので、個人的にコードリーディングして得られた知見をまとめます。
社内文章として残すだけでは勿体無い気がしたので、初めてQiitaを投稿します。今回扱うのは、Rails version5以降に標準搭載のWebサーバーである[Puma](https://github.com/puma/puma)の、現時点での最新版である5.1.1の内部アーキテクチャ・実装についてです。
(SingleモードでのPumaの挙動についてまとめており、バージョン5以降で実装されたClusterモードでのスリープソートなどの最適化実装は扱っていません)## 前提
PumaはRack準拠のWebサーバーです。Rackとはruby製のアプリケーションフレームワークとWebサーバーのインターフェースに関する仕様で、これらがRackの仕様を満たしている限り任意に交換可能になります。
pumaはこのRackの仕様のうち、Webサーバー
rails resources
#resourcesとは
railsで定義されている7つのアクションのルーティングを自動で作成するメソッド
具体的には|アクション名| 役割 |
|:-:|:-:|
| index | リソースの一覧を表示させる |
| show | リソースの詳細を表示させる |
| new| 投稿フォームを表示させる|
| create | リソースを追加させる |
| edit | 更新フォームを表示させる |
| update | リソースを更新させる |
| destroy | リソースを削除する |“`
resources :tweets
“`
と“`
get ‘tweets’ => ‘tweets#index’
get ‘tweets/:id’ => ‘tweets#show’
get ‘tweets/new’ => ‘tweets#new’
post ‘tweets’ => ‘tweets#create’
get ‘tweets/:id/edit’ => ‘tweets#edit’
patc
paranoia only_deletedメソッドのクセ
## 何が言いたいか
paranoiaが用意している`only_deleted`メソッドは便利そうに見えてクセがあるなと感じました。## paranoia?
https://github.com/rubysherpas/paranoia
論理削除でおなじみのgem。
`acts_as_paranoid`とモデルに書くだけで、物理ではなく論理削除してくれるようになる。
(destroy!とかするとdeleted_atに値が入る)## 事象
下記のようなテーブルがあるとします。
**Userモデル**| id | name | age | deleted_at |
| — | — | — | — |
| 1 | けんじ | 5 | 2021-01-01 11:38:30
| 2 | たろう | 6 | null |
| 3 | じろう | 5 | null |## 今回登場するメソッド
### with_deleted
論理削除されたレコードも取得できる
便利そう!“`ruby
User.all
# => ID: 2, 3を取得できる
User.wit
railsで実装した複数画像投稿機能で投稿された画像にswiperを適用させる
# 開発環境
Mac OS Catalina 10.15.7
ruby 2.6系
rails 6.0系# 前提
アクティブストレージを用いた、複数枚画像投稿機能は実装済みとします。
投稿した複数の画像を、indexページなどで、swiperを用いて表示させることをゴールとします。
私が作っている写真投稿ができるアプリを例にしています。# CDN読み込み
まずはCDNを読み込みます。
application.html.erb内のheadタグの中に下記のどちらかを追加しましょう。“`application.html.erb
# どちらかをheadタグ内に記述 “`
下が最小限の機能で、上が全機能という違いがあります。
公式ドキュメントを全て読んだわけではないの
FactoryBotについて
今回が初めての投稿になります、自分の中で理解できたことなどを書いていこうと思います。
今回はテストコードのFactoryBotについて書いていきます。
FactoryBotとは簡単にいうとインスタンスをまとめてくれるGemです。テストコードを書いていて it “~”とexampleをかなりの量を書くことがあり、その度にテーブルの情報を変数に代入する記述を書くのはかなり大変なのでそれを改善するためにFactoryBotは用いられます。
これを用いるにはまず別のファイルで各クラスのインスタンスに定める値を設定しておき、各テストコードで使用していきます。例えとしてあるユーザーの情報をインスタンス生成するとしたら
user = User.new(nickname: “A”, password: “qwer”)
このような記述を毎回書くのは非効率ですのでFactoryBotを利用します。すると
user = FactoryBot.build(:user)と短く書くことができます。ですがこれでも毎回書かないのでインスタンス変数を利用するとさらに記述量が少なくなります。
@user = Fa
rails newするときのoptionなにしたらええんやっけ?となったとき
“`rb
$ bundle exec rails help
Usage:
rails new APP_PATH [options]Options:
[–skip-namespace], [–no-skip-namespace] # Skip namespace (affects only isolated applications)
-r, [–ruby=PATH] # Path to the Ruby binary of your choice
# Default: /Users/shoutaro/.rbenv/versions/2.7.2/bin/ruby
-m, [–template=TEMPLATE] # Path to some applicati
railsのバリデーション
#バリデーションとは
正当性を実証(確認)すること。
例えば、新規登録フォームでユーザー名が入力されていなかったら登録できない、
メールアドレスが正規の型でない等を検知する。#新規登録時に名前、メールアドレスが入力されているか検証する
app/models/user.rbファイルに記入する。
validatesメソッドに presence:trueという引数を与えて使うことで検証できます。“`ruby:app/models/user.rb
class User < ApplicationRecord validates :name, presence: true validates :email, presence: true end ``` #長さを検証する 上記のコードにlenghtを追加します。 今回は名前を50文字、メールアドレスを255文字を制限とします。 ```ruby:app/models/user.rb class User < ApplicationRecord validates :name, presence: true, length
アプリケーションの作成〜立ち上げ
#アプリケーション作成の流れ
①アプリケーションを保存するためのディレクトリを作成
②新規のrailsアプリケーションを作成
③データベースを作成
④アプリのケーションの立ち上げ###①アプリケーションを保存するためのディレクトリを作成
ホームディレクトリから新規フォルダで適当な名前のディレクトリを作成する###②新規のrailsアプリケーションを作成
“`
cd ①のディレクトリ
#①のディレクトリに移動するrails railsのバージョン new Career_up -d mysql
#railsのバージョンを指定して、Career_upを作成cd Career_up
#Career_upのディレクトリに移動するpwd
#現在のディレクトリに移動
“`###③データベースを作成
“`
rails db:create
#データベースを作成する
“`###④アプリのケーションの立ち上げ
“`
cd Career_up
#Career_upのディレクトリに移動するrails s
#C
Model.human_attribute_name(:カラム名)について(Rails)
# 経緯
普段viewでよく見かけるタイトルについて自分の学習用のメモ的な感じです。#Model.human_attribute_name(:カラム名)とは?
ActiveRecord::Base のクラスメソッドで内部的にI18nモジュールを
利用してくれるというものです
参照先は config/locales/ja.ymlです。“`ja.yml
—
ja:
activerecord:
errors:
messages:
record_invalid: ‘バリデーションに失敗しました: %{errors}’
restrict_dependent_destroy:
has_one: “%{record}が存在しているので削除できません”
has_many: “%{record}が存在しているので削除できません”
models:
task: タスク
attributes:
task:
id: ID
nam
Rails で 特定のページに別のレイアウト(デザイン)を指定する方法
# 始めに
ウェブアプリをつくっていると、それぞれのページでレイアウト(デザイン)を変更したいことがあります。
例えば、下層ページのデザインは共通で良いが、トップページだけは別のデザインにしたいといった場合です。# 環境
“`
% rails -v
Rails 6.1.1% ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20]
“`# 実装
Slimを使って効率的にhtmlを記述できるにします。
また、Sassを使って効率的にスタイルシートを書けるようにします。
そのために、Gemfileに以下を追記します。“` ruby
# Gemfile
gem ‘slim-rails’
gem ‘sass-rails’
“`## 下層ページ全体
下層ページ全体で共通して使う スタイルシート application.scss は次のように書きます。“` scss
// app/assets/stylesheets/applicati
Ruby on Railsでアプリを作ってみよう⑤
##モデルとデータベースの役割
入力した情報などを保存しておくことができなければ
アプリケーションとして成り立ちません。今回は情報を保存するためのデータベースとモデルについて学習していきましょう。
##テーブル
データベース内に作成される表形式でデータを収納する仕組みです。
全ての情報がごちゃ混ぜに保存されていると管理ができませんので
情報の種類ごとにテーブルを作成し管理します。図1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/8544d631-66d3-920a-8699-881668a0b6af.png)##レコードとカラム
表形式のテーブルに置いて行はレコード列はカラムといいます。図2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/7ffc6921-c712-f659-91fd-93d7027f6a9b.png)##モ
Docker開発環境
#はじめに
現在開発中のアプリにDockerを導入したのでアウトプットします。#環境
Ruby on Rails ‘6.0.0’
Ruby ‘2.6.5’
MySQL ‘5.6.47’# Dockerfile
開発中アプリのルートディレクトリにDockerfileを作成します。“`ruby:Dockerfile
FROM ruby:2.6.5RUN apt-get update -qq && \
apt-get install -y build-essential \
libpq-dev \
nodejsRUN mkdir /アプリ名
WORKDIR /アプリ名ADD ./Gemfile /アプリ名/Gemfile
ADD ./Gemfile.lock /live_search/Gemfile.lockRUN gem install bundler
RUN bundle install
ADD . /アプリ名
“`# docker-compose
【Ruby on Rails Tutorial】6章のテストでエラー
# 【Ruby on Rails Tutorial】6章のテストでエラー
Ruby on Rails Tutorial 6章の「リスト 6.10」を実行。
すると、あるエラーが発生した。
その後はいつも通りライアーゲームのBGMが脳内で流れると共に膝から崩れ落ちて就寝。
次の日の朝「直すか……」# 目次
1. [どういうエラー?](#どういうエラー)
1. [解決法は?](#解決法は)
1. [参考文献](#参考文献)以下のようなエラーが発生。
“`言語名:ターミナル
PS C:\Users\(ユーザー名)\Desktop\Web\Ruby\rails_tutorial\sample_app2> rails test:models
ansi: ‘gem install win32console’ to use color on Windows
LoadError: UNIXServer is
No template for interactive request IdeasController#index is missing a template for request formats: text/htmlというエラーが出た
#rails s を行ったら以下のエラーが出た
“`
No template for interactive request
IdeasController#index is missing a template for request formats: text/htmlNOTE!
Unless told otherwise, Rails expects an action to render a template with the same name,
contained in a folder named after its controller. If this controller is an API responding with 204 (No Content),
which does not require a template, then this error will occur when trying to access it via browser,
since we expect an HTML template to be rendered for
Rails RSpecテストを導入しよう!
#経緯
Railsチュートリアルなどではminitestが使われているが
実際の現場ではRSpecを用いたテストを行っているため
今回はRailsにRSpecを導入するまでの手順を乗せていこうと思います。#利用するテスト用ライブラリ
1 RSpec
2 Capybara
3 FactoryBot
# RSpecのインストールと初期準備“`Gemfile
group :development, :test do
# Call ‘byebug’ anywhere in the code to stop execution and get a debugger console
gem ‘rspec-rails’, ‘~>3.7’
end
“`
次に以下のgenereteコマンドを実行します。“`ターミナル
bundle
bin/rails g rspec:install
=>Running via Spring preloader in process 4359
create .rspec
create spec
create
【Docker + CircleCI + Rails】Missing secret_key_base エラー
## 環境
Ruby 2.7.1
Rails 6.0.3.4CircleCIを使ってECSへデプロイ時に以下のようなエラーが発生
“`
rake aborted!
ArgumentError: Missing `secret_key_base` for ‘production’ environment, set this string with `rails credentials:edit`
“`## 結論
Railsのmaster.keyをCircleCIの環境変数に設定しconfig.ymlとDockerfileに設定した環境変数を渡す事で解決しました。### Step1
CircleCI環境変数設定
nameを`RAILS_MASTER_KEY`とし、
valueに`master.key`の値を入力### Step2
Dockerfileに追記“`dockerfile:Dockerfile
# 追記
ARG RAILS_MASTER_KEY
ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY}
“`### Step