- 投稿日:2020-07-30T22:58:53+09:00
バリデーションエラーの表記を日本語表記に変更する方法
学習を進めてる中
Name can't be blank
等のバリデーションエラーを日本語に変更する方法を学んだのでまとめようと思います。まず日本語の設定にするためのgemをインストールします。
Gemfilegem 'rails-i18n'これだけではまだ変更は完了していません。
config/application.rbに以下の一文を追記します。これにより、サーバ再起動後にエラーメッセージが日本語化されます。config.i18n.default_locale = :jaこれにより、サーバ再起動後にエラーメッセージがこのように表示されるはずです。
Nameを入力してください。カラムの日本語化自体もできるみたいですが今後実装する際に追記したいと思います。
ちなみに。。。。。
i18nとは
Wikipediaによると・・・
情報処理における国際化と地域化(こくさいか と ちいきか)は、ソフトウェアを開発した環境とは異なる環境、特に外国や異文化に適合させる手段である。
国際化(アメリカ英語: internationalization イギリス英語: internationalisation、i18n) は、ソフトウェアに技術的な変更を加えることなく多様な言語や地域に適合できるようにする、ソフトウェア設計の工程である。
ソフトウェアの技術的変更なしで様々な言語に対応できるということでしょうか。。
- 投稿日:2020-07-30T21:53:33+09:00
RSpecの単体テストにて"translation missing: ja.activerecord.○○"というエラーが出たときの対処法
Deviseを日本語化したときのエラー。エラー画面はこんな感じ。
◆原因
どうやらdeviseのエラーメッセージを日本語化したことによって
本来Deviseで用意されているエラー文(英語)
とテスト実行時のエラー文(devise.ja.yml)
に相違が出てしまい、エラーになってしまってるぽい。◆解決策
巷に落ちている
devise.ja.yml
の内容もそれぞれ引用元によって異なるため、このエラーが出た際にはdevise.ja.ymlに記述を追加する必要がある。実際に記述を追加していく。
今回の場合エラー分が
expected [translation missing: ja.activerecord.errors.models.user.attributes.name.blank] to include "can't be blank"
なのでconfig/locals/devise.ja.ymlja: activerecord: errors: models: user: attributes: name: blank: "が入力されていません"と追記してあげる。
これで無事にテストが通るように!
参考にした記事
・Devise日本語化後の「translation missing」に対処する
・Createの際のエラーUser translation missing: ja.activerecord.errors.models.company.attributes.user.required
- 投稿日:2020-07-30T21:43:35+09:00
Fabricateの使い方をまとめる
なんとなく使えてしまうFabricateですが、ふとしたきっかけでちゃんと理解したいなと思ったのでまとめました。
Fabricateとは
オブジェクト生成ライブラリです。
テストで使用するためのオブジェクトを簡単に作成できます。使い方
非常にシンプルで、モデルの属性に無難なデフォルト値を設定します。
サンプルでperson
というオブジェクトを定義しました。Fabricator(:person) do name "Niki" age 23 end生成メソッド
生成メソッドは3種類あります。よく使うのは
Fabricate.build
とFabricate
。Fabriate(:person) # newしてsaveしたものを返す Fabricate.build(:person) # newだけしてsaveはしない Fabricate.attributes_for(:person) # 属性のHashを返す一見
Fabricate.build
は必要なくない?となりますが、これは間違いです。
.build
を使うとインスタンスを保存しないので、specの処理時間の軽減につながります。なので、
.build
を使えない場合のみインスタンスを生成し、基本的には.build
を使うようにしています。属性の値を明示する
定義したオブジェクトの属性の値を変えたい場合は以下の様にします。
person = Fabricate(:person, name: "Peru") person.name = "Peru"また、関連しているデータを紐づけることも簡単にできます。
例えば、book
モデルがbelong_to
でperson
モデルに紐づいている場合は以下の様にしてFabricate
で表現できます。Fabricator(:book) do name "キングダム" price 1000 end book = Fabricate.build(:book, person: Fabricate.build(:person))これらは基本的な内容ですが、ちゃんと理解するとテストのコーディングスピードも上がると思います。他にも色々便利なメソッドがありますので暇があれば調べてみて下さい。
何かいいメソッドや書き方があれば、是非コメントください!
- 投稿日:2020-07-30T21:43:35+09:00
[Rspec]Fabricateの使い方をまとめる
なんとなく使えてしまうFabricateですが、ふとしたきっかけでちゃんと理解したいなと思ったのでまとめました。
Fabricateとは
オブジェクト生成ライブラリです。
テストで使用するためのオブジェクトを簡単に作成できます。使い方
非常にシンプルで、モデルの属性に無難なデフォルト値を設定します。
サンプルでperson
というオブジェクトを定義しました。Fabricator(:person) do name "Niki" age 23 end生成メソッド
生成メソッドは3種類あります。よく使うのは
Fabricate.build
とFabricate
。Fabriate(:person) # newしてsaveしたものを返す Fabricate.build(:person) # newだけしてsaveはしない Fabricate.attributes_for(:person) # 属性のHashを返す一見
Fabricate.build
は必要なくない?となりますが、これは間違いです。
.build
を使うとインスタンスを保存しないので、specの処理時間の軽減につながります。なので、
.build
を使えない場合のみインスタンスを生成し、基本的には.build
を使うようにしています。属性の値を明示する
定義したオブジェクトの属性の値を変えたい場合は以下の様にします。
person = Fabricate(:person, name: "Peru") person.name = "Peru"また、関連しているデータを紐づけることも簡単にできます。
例えば、book
モデルがbelong_to
でperson
モデルに紐づいている場合は以下の様にしてFabricate
で表現できます。Fabricator(:book) do name "キングダム" price 1000 end book = Fabricate.build(:book, person: Fabricate.build(:person))これらは基本的な内容ですが、ちゃんと理解するとテストのコーディングスピードも上がると思います。他にも色々便利なメソッドがありますので暇があれば調べてみて下さい。
何かいいメソッドや書き方があれば、是非コメントください!
- 投稿日:2020-07-30T21:43:35+09:00
[Rspec]Fabricateの基本的な使い方まとめ
なんとなく使えてしまうFabricateですが、ふとしたきっかけでちゃんと理解したいなと思ったのでまとめました。
Fabricateとは
オブジェクト生成ライブラリです。
テストで使用するためのオブジェクトを簡単に作成できます。使い方
非常にシンプルで、モデルの属性に無難なデフォルト値を設定します。
サンプルでperson
というオブジェクトを定義しました。Fabricator(:person) do name "Niki" age 23 end生成メソッド
生成メソッドは3種類あります。よく使うのは
Fabricate.build
とFabricate
。Fabriate(:person) # newしてsaveしたものを返す Fabricate.build(:person) # newだけしてsaveはしない Fabricate.attributes_for(:person) # 属性のHashを返す一見
Fabricate.build
は必要なくない?となりますが、これは間違いです。
.build
を使うとインスタンスを保存しないので、specの処理時間の軽減につながります。なので、
.build
を使えない場合のみインスタンスを生成し、基本的には.build
を使うようにしています。属性の値を明示する
定義したオブジェクトの属性の値を変えたい場合は以下の様にします。
person = Fabricate(:person, name: "Peru") person.name = "Peru"また、関連しているデータを紐づけることも簡単にできます。
例えば、book
モデルがbelong_to
でperson
モデルに紐づいている場合は以下の様にしてFabricate
で表現できます。Fabricator(:book) do name "キングダム" price 1000 end book = Fabricate.build(:book, person: Fabricate.build(:person))これらは基本的な内容ですが、ちゃんと理解するとテストのコーディングスピードも上がると思います。他にも色々便利なメソッドがありますので暇があれば調べてみて下さい。
何かいいメソッドや書き方があれば、是非コメントください!
- 投稿日:2020-07-30T21:10:33+09:00
postgres sqlコマンド 自分用
postgresqlよく使うコマンド
※#から始まるコマンドはpsql内で、$から始まるコマンドはpsql外で実行するコマンドとなる。
バージョンを確認する
$ psql —version # select version();ヘルプを表示
$ psql --help # \? # \hデータベース
データベースに入る
$ psql <DB_NAME>ユーザーを指定してデータベースに入る
$ psql -U <USER_NAME> <DB_NAME>データベースから出る
# \qデータベースを起動
$ postgres -D /usr/local/var/postgresデータベース一覧表示
$ psql -l # \lデータベースの切り替え
# \c <DB_NAME> # \connect <DB_NAME>データベースを削除
# drop database <DATABASE_NAME>;テーブル テーブル一覧表示(viewやsequenceも含む)
# \dテーブル一覧表示
# \dtテーブルのスキーマの詳細を表示
# \d <TABLE_NAME>テーブルのアクセス権限表示
# \z <TABLE_NAME>viewの一覧を表示
# \dvviewの定義を表示
# select definition from pg_views where viewname = '<VIEW_NAME>';テーブル名変更
# alter table <CURRENT_DB_NAME> rename to <NEW_DB_NAME>;テーブルを削除
# drop table <TABLE_NAME>;ユーザー権限
現在のユーザー(Role)を表示
# select current_user;ユーザー(Role)の一覧を表示
# \duユーザー情報一覧を表示
# select * from pg_user;ユーザー (Role)に権限を付与
# grant select, insert, update, delete on <TABLE_NAME> to <USER_NAME>;ユーザー (Role)に権限を剥奪
# revoke select, insert, update, delete on <TABLE_NAME> from <USER_NAME>;ユーザーの切り替え
# \connect - <USER_NAME>スーパーユーザーへ変更
# alter role <USER_NAME> with creatural superuser;スーパーユーザー権限剥奪
# alter role <USER_NAME> with creatural nosuperuser;スキーマ
スキーマ作成
# create schema <schema_name>;スキーマを確認
# select current_schema;スキーマ一覧
# \dnスキーマ変更
# set search_path to <schema_name>;
- 投稿日:2020-07-30T20:41:38+09:00
Railsでslimを使う
プログラミングの勉強日記
2020年7月30日 Progate Lv.226
概要
こちらの記事で扱ったgemのslimを説明する。slimはHTMLよりもコードを早くきれいにシンプルに書ける。erbと同じで、Rubyを埋め込むこともできる。Hamlと似ていて、slimには閉じタグが存在しないので、コードを簡単かつすっきり書くことができる。
使い方
slimを使うためにGemfileを編集する。
Gemfilegem 'slim-rails'Gemfileを編集したら、hamlをインストールする。
ターミナルbundle installこれで、
index.html.slim
といったビューファイルの拡張子にslim
を使えるようになる。すでにあるerbファイルをslimファイルに変えたい場合
Gemfilegem 'html2slim'ターミナル# erbファイルを残して変換 erb2slim 変換するファイルがあるフォルダまたはファイル名 # erbを削除して変換 erb2slim 変換するファイルがあるフォルダまたはファイル名 -d基本的な書き方
slimタグには閉じタグが必要ない。代わりにインデントを使ってマークアップする箇所を指定する。インデントはそろえる必要がある。(3つのスペースを使ったらその後も3つスペースに、4つスペースを使ったらそのあとも4つスペースに)
slimdoctype html div h1 Hello World! ul li Ruby li Rails li HTMLHTMLで以下のように変換されている
html<!DOCTYPE html> <div> <h1>Hello World!</h1> <ul> <li>Ruby</li> <li>Rails</li> <li>HTML</li> </ul> </div>slimの書き方
各タグの書き方
slimでの書き方 コンパイル後のコード(HTML) div
<div></div>
html
<html></html>
meta
<meta></meta>
header
<header></header>
footer
<footer></footer>
table
<table></table>
h1
<h1></h1>
p
<p></p>
a
<a></a>
ul
<ul></ul>
li
<li></li>
テキストの書き方
テキストは
|
で定義する。slimp | Hello World /複数行の場合(改行なし) p | こんにちは。 私の名前は田中太郎です。 /複数行の場合(改行あり) p | こんにちは。<br> 私の名前は田中太郎です。HTMLでは以下のように変換されている
html<p>Hello World</p> <p>こんにちは。 私の名前は田中太郎です。</p> <p>こんにちは。<br> 私の名前は田中太郎です。</p>属性の書き方
slim:slim
a href='http://www~' リンク先の名前
HTMLでは以下のように変換されているhtml<a href="http://www~">リンク先の名前</a>IDとclassの書き方
div
を省略することができる。haml#id_name idを指定する div.class_name classを指定する .class_name classを指定するHTMLでは以下のように変換されている
html<div id="id_name">idを指定する</div> <div class="class_name">classを指定する</div> <div class="class_name">classを指定する</div>
- 投稿日:2020-07-30T20:17:25+09:00
コントローラーでのデータ検索等
データの絞り込み
データの絞り込みは下記の構成
例)Task.all.first
Task = 起点
all = 絞り込み条件
first = 実行部分起点
処理対象のモデルのクラス
絞り込み条件
メソッド 効果 where 特定のレコードの検索 order 検索結果の並び順を指定 joins 他のテーブルとのJOINを指定 group 指定したカラムの値を基準にデータをグループ化 select 指定したからむだけを属性として取得する limit 取得個数を制限する distinct 取得するカラムの値が一致しているデータは除外してデータを取得 all 全件取得 none 何もヒットさせない 実行部分
メソッド 効果 find idを指定して取得 ない場合は例外 Task.find(1) find_by 条件指定し取得 ない場合はnil Task.find_by(name:"mayu") なし 他のテーブルとのJOINを指定 first 検索条件に合う最初のレコードに対応するオブジェクトを取得 last 検索条件に合う最後のレコードに対応するオブジェクトを取得 exisit? 検索条件に合うレコードの有無を取得 count 取得するカラムの値が一致しているデータは除外してデータを取得 average COUNT関数を使って平均を取得 maximun AVG関数を使って最大値を取得 minimum AVG関数を使って最小値を取得 update_all 検索条件にあうレコードを全てインスタンス化せずに更新 delete_all 検索条件にあうレコードを全てインスタンス化せずに削除 destroy_all 検索条件にあうレコードを全てインスタンス化した上で削除 並び替え
tasks_controllerclass TasksController < ApplicationControlller def index @tasks = current_user.tasks #新しい順で検索するには① 古い順で検索するには② @tasks = current_user.tasks.order(created_at: :desc) #① @tasks = current_user.tasks.order(created_at: :asc) #② endscopeの活用
scopeを使い、クエリ用のメソッドの連続した呼び出し部分に名前をつけて、メソッドとして使用することができる
modelclass Task < ApplicationRecord scope :recent, -> {order(created_at: :desc)} #recentという名で定義 end #recentの使い方 tasks = Task.recent task = Task.recent.first task = Task.recent.last tasks = current_user.tasks.recent tasks = Task.where(user_id: [1,2,5]).recentフィルタ
同じコードを複数記述していると変更を行う必要があるときに重複箇所全てに対して変更を行わなければいけない。フィルタを使って重複を避けることを心がける
tasks_controllerclass TasksController < ApplicationController before_action :set_task, only: [:show, :edit, :update, :destroy] def show end def edit end def update end def destroy end private def set_task @task = current_user.tasks.find(params[:id]) end endURL表示
rails_autolinkと言うgemを使いURLを表示させる
gemfilegem 'rails_autolink'auto_link(simple_format(h(@task.description),{},sanitize: false, wrapper_tag: "div:))
- 投稿日:2020-07-30T18:38:21+09:00
Controllerを作成しよう
Controllerを作成する
コントローラでは、ユーザーのリクエストを受けてModelと連携したり、
どの画面(View)を表示するかを制御しています。
ユーザーがURLにアクセスしたときに、リクエストを最初に受け取るのがコントローラです。
受け取ったリクエストを元にして、Modelからのデータを、対応するViewに渡して画面を表示させます。具体的には、以下のような制御を行っています。
Modelとやり取りする
Viewに渡すインスタンス変数を定義する
表示するViewファイルを指定するcontrollerを作成するのは以下を実行するだけです。
gはgenerateの略称です。$ rails g controller コントローラ名ただ、一つだけ注意があります。
コントローラー名は複数形になります。こんな感じです。$ rails g controller homes成功するとこんな感じになります。
[vagrant@localhost sample_app]$ rails g controller homes Running via Spring preloader in process 29768 create app/controllers/homes_controller.rb invoke erb create app/views/homes invoke test_unit create test/controllers/homes_controller_test.rb invoke helper create app/helpers/homes_helper.rb invoke test_unit invoke assets invoke coffee create app/assets/javascripts/homes.coffee invoke scss create app/assets/stylesheets/homes.scss間違えてControllerを作成してしまったら?
コントローラー名などを間違えて作成した場合は、以下のコマンドで消しましょう。
勘の良い人はわかるかもしれませんが、
dはdestroyを意味します。[vagrant@localhost sample_app]$ rails d controller homes
- 投稿日:2020-07-30T18:17:49+09:00
MVC(Model View Controller)を理解しよう
MVC(Model View Controller)とは?
railsはMVCという考え方で構成されています。
全てのコードを同じ場所に書いてしまうと、コードが複雑になるため、
railsでは、保守性を維持するために、Model、View、Controllerの3つの処理パターンに分けて管理しています。model
データを扱う部分です。
データベースに対して、データの登録や取得、更新、削除などの処理を行います。view
PCの画面に関わる部分です。
HTMLを読み込み、ブラウザに表示させるためのものです。controller
modelとviewの中間に位置します。
ユーザーからのリクエストを受けて、Modelと連携したり、どの画面(View)を表示するのかといったことを制御します。
- 投稿日:2020-07-30T16:22:37+09:00
Rubyで「ある期間の毎月1日」をDateオブジェクトの配列として取得する方法
Rubyの小ネタです。
お題
2020年4月1日から2021年3月1日まで、1年分の「xxxx年xx月1日」のDateオブジェクトを配列として取得するコードを書いてください。
イメージとしてはこんな感じです。
# 見やすいように文字列の配列にしていますが、本当はDateオブジェクトの配列を取得するのがゴールです [ "2020-04-01", "2020-05-01", "2020-06-01", "2020-07-01", "2020-08-01", "2020-09-01", "2020-10-01", "2020-11-01", "2020-12-01", "2021-01-01", "2021-02-01", "2021-03-01" ]解答例
こんな感じで書けます。
require 'date' start_date = Date.parse '2020/04/01' end_date = Date.parse '2021/03/01' (start_date..end_date).select{|d| d.day == 1} #=> [#<Date: 2020-04-01 ((2458941j,0s,0n),+0s,2299161j)>, #<Date: 2020-05-01 ((2458971j,0s,0n),+0s,2299161j)>, (中略), #<Date: 2021-03-01 ((2459275j,0s,0n),+0s,2299161j)>]Railsであれば
Date.parse
の代わりにto_date
が使えます。# Railsの場合 start_date = '2020/04/01'.to_date end_date = '2021/03/01'.to_date (start_date..end_date).select{|d| d.day == 1} #=> [Wed, 01 Apr 2020, Fri, 01 May 2020, (中略), Mon, 01 Mar 2021]むりやり1行で書くとこんな感じ。(可読性がイマイチなのであまりお勧めしませんが)
# Railsの場合 Range.new(*%w[2020/04/01 2021/03/01].map(&:to_date)).select{|d| d.day == 1} #=> [Wed, 01 Apr 2020, Fri, 01 May 2020, (中略), Mon, 01 Mar 2021]いったん335日分のDateオブジェクトの配列を作ってから、毎月1日のDateオブジェクトだけをselectするので若干処理効率が悪いところはありますが、何十年、何百年という期間を対象にしないのであれば、たぶん大きな問題にはならないんじゃないかなー、と思っています。
以上、Rubyの小ネタでした!
おまけ
Railsの
next_month
メソッドとRuby 2.7で導入されたEnumerator.produce
を使って、無駄なDateオブジェクトを作らない処理を考えてみました。これもなかなか良さそうです。# Rails + Ruby 2.7 start_date = '2020/04/01'.to_date end_date = '2021/03/01'.to_date Enumerator.produce(start_date, &:next_month).take_while{|d| d <= end_date} #=> [Wed, 01 Apr 2020, Fri, 01 May 2020, (中略), Mon, 01 Mar 2021]素のRubyでも
>> 1
を使えば1ヶ月後のDateオブジェクトが取得できるので、Ruby 2.7単体でこういう書き方もできます。# Ruby 2.7 require 'date' start_date = Date.parse '2020/04/01' end_date = Date.parse '2021/03/01' Enumerator.produce(start_date){|d| d >> 1}.take_while{|d| d <= end_date} #=> [#<Date: 2020-04-01 ((2458941j,0s,0n),+0s,2299161j)>, #<Date: 2020-05-01 ((2458971j,0s,0n),+0s,2299161j)>, (中略), #<Date: 2021-03-01 ((2459275j,0s,0n),+0s,2299161j)>]
- 投稿日:2020-07-30T14:30:13+09:00
作業環境をcloud9からVScodeに変更した
Ruby on railsでアプリを作成し、ec2環境までのデプロイが完了した。
ここまでの作業環境としてAWSのcloud9を利用してきた。
作品のレベルを上げるためにdockerの導入を検討し、それならば、作業環境をcloud9から卒業しVScodeに移行しようと考えた。docker.fileとdocker-compose.ymlを作成し、無事にdocker環境下でもアプリの動作が確認できた。
git hubでpushし、cloud9にgit pullでファイルを同期させたところ、cloud9環境下でエラーが発生した。
原因はdocker導入にあたり以下の変更を加えたことである。
database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %> # host: localhost 変更前 host: db # 変更後hostをdbに変更したことにより起きたエラーだった。
vscode環境でも動作が確認できているので、cloud9は捨てるか、こちらにもdockerをインストールするかだが、
cloud9はの環境はブラックボックス的な部分があり、知識が不足しているため安易な変更は加えたくない。。。ひとまず今回の目的である、作業環境をvscodeに変更し、dockerを導入することは完了したのでOKとした。
cloud9上でdockerを導入している人がいたら教えていただけたら幸いです。
- 投稿日:2020-07-30T12:58:32+09:00
Railsで開発中にLocalのMySQLのバージョンを8系から5.7に変更したらいろいろハマった
現在Railsでポートフォリオ作成中のたか(@ktkr7195)です。
Sequel Proを使ってDBの情報を参照しようとしたら、MySQL8系だと繋がらない問題に打ち当たり、バージョンを5.7にすれば治るらしいという記事を拝見し、変更したら事件が起きました。
環境
- Rails 5.2.4
- macOS 10.15.5
- MySQL 5.7
- ruby 2.5.1
状況
まずHomebrewで
brew install mysql
でMySQLをインストールしてローカルで開発をしていました。おそらく、バージョン指定しないと最新の8系がインストールされます。rails db:create
やrails db:migrate
等無事に成功し、アプリケーションが表示されるようになりました。開発を進めていく中でDBを参照することが多くなったのでSequel Proを使おとしたら弾かれてしまいこちらの記事を参考に修正したらrails db:migrate
ができなくなったのでMySQLのバージョンを落とすことに。手順
①Mac MySQLをきれいにする
まずはこちらの記事を参考にMySQLをきれいにして、インストールし直す。この際自分はこちらを見て5.7をインストールしました。②bundle doctorで原因を調べる
こちらの記事を参考に。感想
自分の場合は上の手順で解決しましたが、ここまで来るのに結構時間を使ってしまったので、同じような境遇の人がいたら参考になれば嬉しいです。
参考
- https://pqtomblog.com/2018/09/20/connecting_mysql_by_sequelpro/
- https://qiita.com/onoblog/items/4d67b3731debffcf6b2d
- https://qiita.com/renny1398/items/5df494a2b2f5d74b24f4
- https://qiita.com/hayte/items/cea0b7762d3adf096b8b
- https://qiita.com/SatoMaru/items/986aa0a63af28a8b6273
- https://www.takafumitaba.com/mysql-already-exists
- https://weblabo.oscasierra.net/mysql-57-homebrew-install/
- 投稿日:2020-07-30T01:31:19+09:00