dev/mom0tomo

技術メモ

Ruby on Rails

Railsのrespond_toの働き

読んだもの http://railsdoc.com/references/respond_to 学んだこと respond_toは、クライアントからの要求に応じて、返却するレスポンスのフォーマットを切り替えるメソッド。 respond_to do |format| format.json end 上のように記述し、items.json.slimを…

Rspecで実行順序に依存して落ちるテストの再現にはseed値を使う

読んだもの ruby - Rspecのフィーチャーテストが失敗したりしなかったり - スタック・オーバーフロー 学んだこと テストが落ちたり落ちなかったりする場合、まず問題が出るシード値を特定する。 Randomized with seed 12130 Rspecを実行すると、上のようにSp…

FactoryBotとfixturesの比較

Rspecを使ってテストを書いているが、どちらを使うべきかいつもパッと浮かばないのがイヤなので、まとめた。 読んだもの woshidan.hatenablog.com blog.jnito.com 学んだこと fixtures 固定のデータ(都道府県など)がほしいときに使う。 コントローラのテス…

【メモ】ストロングパラメータを使うのはどういうときか

読んだもの railsguides.jp 学んだこと 結論 基本的にPOSTやPUTでリソースに変更を加えるときに使う。 ストロングパラメータの目的は、Active Modelに不適切な値が入れられ、それを公開してしまうのを防ぐこと。 そのため、POSTやPUT以外はまず使わない。 ス…

tryとtry!とぼっち演算子(&.)でレシーバがnilのときのエラーに対処する

読んだもの sakurawi.hateblo.jp qiita.com 学んだこと tryとtry!とぼっち演算子(&.)は、レシーバがnilのときのエラーに対処する為に使う。 try user.try(:name) レシーバであるuserがnilでないなら、メソッドを実行する。 レシーバとは、hoge.methodと書…

ビジネスロジックはモデルに書く、とはどういうことか

コードレビューで指摘を受けたので改めて調べてまとめた。 読んだもの https://wa3.i-3-i.info/word13666.html ビジネスロジックとは - IT用語辞典 学んだこと ビジネスロジックとは アプリケーション固有の処理やルールを記述したもの。 「ビジネスロジック…

form_withを使って検索フォームをつくる

form_withを使ってこんな検索フォームを作った。 user/index.html.slim = form_with model: User.new do |form| = form.label :name, '名前' = form.text_field :name, value: (params[:user][:name] if params[:user]) = form.submit '検索する' users_cont…

form_forとform_tagはform_withへ統合された(Rails 5.1)

読んだもの Ruby on Rails 5.1リリースノート | Rails ガイド 学んだこと なんとRails5.1から統合されていた。マジカヨ... form_for : Modelに基づいたformを作るときに使う form_tag : Modelに基づかないformを作るときに使う(検索フォームなど) と覚えて…

Railsのバリデーションエラーを日本語化する

読んだもの Railsのバリデーションエラーのメッセージの日本語化 学んだこと 下記の手順で設定する。 1.以下のgemをインストールする gem rails-i18n 2.config/application.rbに設定を追加する config/application.rb config.i18n.default_locale = :ja 3.ja…

Railsのモデルと一対多のリレーションのまとめ

読んだもの Rails4で1対多のリレーションをモデルに実装する - Rails Webook Active Record の関連付け (アソシエーション) | Rails ガイド 学んだこと 下記のようなUser has many Itemsという関係のモデルを考える。 user.rb class User < ApplicationRecor…

インスタンスメソッドの理解

ずっともやっとしてた部分を整理したらアハ体験があったのでまとめる。 こんなモデルがある場合。 models/user.rb class User < ApplicationRecord has_many :items end models/item.rb class Item < ApplicationRecord belongs_to :user validates :user_id…

Rails 5.1以降 でjqueryを使う

Rails5.1から、デフォルトではjqueryに依存しない仕様になった。 Ruby on Rails 5.1リリースノート | Rails ガイド jqueryを使うためには下記の手順を踏むこと。 Gemの追加とbundle update Gemfileに gem "jquery-rails"を追加し、bundle updateを実行する。…

Railsアプリを作るときの共通パーツの設定

初期設定はこちら。 mom0tomo.hateblo.jp 共通レイアウトはapp/views/layouts/ に配置する。 headタグのパーツ app/views/layouts/application.html.erb <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>アプリ…</meta></meta></meta></head></html>

Railsの便利なコマンドと設定

新規アプリケーション作成するとき DBの種類を設定する $ rails new {app_name} --database=mysql テストを作成しない $ rails new {app_name} --skip-test bundle installするとき gemのインストールパスを指定する $ bundle install --path vendor/bundle …

モデル名と異なるアソシエーション名を使う場合の決まり

Rails tutorialでも出てくるuserがfollowings/followers(どちらもuserテーブルを使う)を持つ関係を例にまとめる。 models/user.rb class User < ApplicationRecord # followingsのアソシエーション has_many :relationships has_many :followings, through…

Railsのアソシエーションの仕組み

理解するのにものすごく時間がかかったので、まとめておく。 アソシエーションとは 簡単にいうとモデルを参照するためのメソッド。 例は下記に示す。 メソッドはふだん使うときに書くが(当たり前)、アソシエーションは使い道も書き方も決まっていてるので…

find_or_create_byとfind_or_initialize_byの違い

読んだもの blog.hello-world.jp.net 学んだこと 両者の違いは下記の通り。 find_or_create_byだと新規作成して保存 find_or_initialize_byして保存はしない 保存しないことのメリットは、新規作成するときのみ併せて何かする、という処理ができること。 fin…

Rspecで"You must pass an argument rather than a block...." エラー

読んだもの www.d-wood.com 学んだこと matcherにはブロックを受け取れるものとそうでないものがある。 例えば以下のように書くと表題のエラーになる。 context 'とある場合' do it '名前がほげほげであること' do expect { described_class.new(user).name …

多対多のリレーションをhas_manyでモデルに実装する

Railsでは、ActiveRecordのhas_manyかhas_and_belongs_to_manyを使うことで、多対多のテーブルどうしの関連をモデルに実装できる。 基本的には拡張性のあるhas_manyを使った方がよい。 マイグレーションファイルをつくる Twitterクローンの例をもとに、user…

【解消法】has_secure_passwordを使おうと思ったらbcryptでエラー

こんなエラーが出た。 cannot load such file -- bcrypt bcrypt gemでよくあるエラーらしい。 読んだもの https://github.com/codahale/bcrypt-ruby/issues/142#issuecomment-291345799 学んだこと 解消法 $ gem uninstall bcrypt $ gem uninstall bcrypt-ru…

【メモ】herokuにRailsアプリケーションをデプロイするときのコマンド

うっかり忘れがちなので自分用にメモにまとめておく。 // ログイン $ heroku login // アプリケーション作成 $ heroku create my-rails-app // 作成されたか確認 $ heroku apps my-rails-app // herokuにpush $ git push heroku master // pushされたか確認 …

Rails kaminariでページネーションを実装する

読んだもの github.com 学んだこと kaminariの使い方はすごく簡単。 tasks_controller.rb def index @tasks = Task.all.page(params[:page]) # @tasks = Task.all <- kaminari利用前のコード end index.html.erb <h1>タスク一覧</h1> <ul> <% @tasks.each do |task| %> <li> <</li></ul>…

Railsでパーシャルを切り出すときはインスタンス変数をローカル変数にする

new.html.erb <h1>新規タスク作成</h1> <%= form_for(@task) do |f| %> <% f.label :content, 'タスク' %> <% f.text_field :content %> <% f.submit '登録' %> <% end %> <%= link_to '一覧に戻る', tasks_path %> edit.html.erb <h1>タスク編集画面</h1> <p><%= @task.content %></p>…

RailsでviewのフォームからcontrollerにPOSTでデータを送信する

RailsのCRUDの基本のところで、newアクションからcreateアクションにデータを送るあたりがよくわからなくなったのでまとめる。 学んだ事 formタグのPOSTメソッドとパラメータの関係 まずはRailsではなく素のHTMLで考える。 <form action="/" method="POST"> <label>名前: <input type="text" name="target_name"></label> <input type="submit" value="送信"> </form> viewにこのようなフォー…

パラメータがネストしているときのストロングパラメータの書き方

前回の応用編。 読んだもの qiita.com 学んだこと ネストしたパラメータのサンプル { "name": "momo", "address": { "prefecture": "Toyo", "city": "Shinagawa" } } 上記のようなネストした構造のパラメータについて、ストロングパラメータの書き方は以下の…

ストロングパラメータの簡単なサンプル

読んだもの qiita.com 学んだこと Railsではストロングパラメータを必ず使う フォームの受け渡しなどで使わないとエラーになる(警告) ストロングパラメータの基本的な書き方 params.require(:user).permit(:name, :email, :password) やっていること 以下…

Railsのja.ymlでEnumの内容が被ったら

Enumの内容がかぶると、重複エラーになる。 You tried to define an enum named "monthly" on the model "Room", but this will generate a instance method "monthly?", which is already defined by another enum. こういうときはprefixとsuffixをつけて区…

Decorator Helper 違い

Helperに書かれたメソッドをDecoratorに切り出そうとして、「引数どうするんだっけ」と思った。 Helperだけ、Decoratorだけ0-1で書くときはそれほど迷わないことでも、リファクタリングなど2つ同時に作業するとき意外と迷う。 改めてまとめてみた。 読んだも…

Ruby / Railsで日付と日付の差分を求める

読んだもの www.rubylife.jp 学んだこと Timeクラスか、Dateクラスを使う。 時間まで使いたい場合はTimeクラス、日付だけ使いたい場合はDateクラスを使う。 2つのクラスのオブジェクトに対し、「-」を使って差を取得する(引き算ぽい)。 やりたかったこと …

なぜRailsのpartialではインスタンス変数を参照しない方がいいのか

読んだもの kadoppe.com 学んだこと なぜpartialではインスタンス変数を参照しない方がいいのか? コントローラで何を用意すべきか明らかでなくなるから インスタンス変数を介して、partialは呼び出し元のテンプレートだけでなくコントローラとも結びついて…