Railsでよく使うけと忘れてしまいがちなテクニックたち

このメモにはRailsでよく(?)使うけど毎回忘れてしまい、Google検索するところから始めなければならないようなテクニックたちを載せておきます。

 

redirect_toするときにパラメータを渡す

実は簡単で、遷移先のパスの後ろに括弧書きでパラメータを記述すればできます。

redirect_to users_path(:name => '田村', :age => '7')

 

Assets Pipelineを使っている環境でのCSSにおけるファイルパスの書き方

CSSのbackground-imageプロパティにurlキーワードでファイルパスを指定しますが、RailsではAssets Pipelineを使っていると本番環境ではファイルパスが事前にわかりません。そこでimage-urlというキーワードを使います

background-image: image-url("tamurasouko.png")

 

グローバル定数を定義する場所

いろいろなやり方があるみたいですけど、config/initializers/constants.rbを作成してそこに定義するのが個人的にはしっくりきました。

# constants.rb
COMPANY_NAME = '田村倉庫'
PHONE_NUMBER = '0238-24-2130'

 

DBのテーブルから特定のカラムの値を取り出す

ActiveRecordのpluckメソッドを使います。

@user_names = User.where(:age => 20).pluck(:name)

ちなみにUser.all.pluckとするとエラーになるので注意。この場合はUser.pluckと記述します。

 

日付の操作

Rails、というかRubyの日付処理は以下のように非常に直感的に行えます。

current_date = Date.today
at_next_month = current_date + 1.month # 1ヶ月後の日付
at_next_year = current_date + 1.year # 1年後の日付

 

ActiveRecordで「比較」の検索条件を指定

大なり小なりといった大小を比較するときは以下のようにします。(他にもっといい方法があるような気もしますが)

target_users = User.where("age > ?", 20)

 

ActiveModelのバリデーションを実行

通常、ActiveModelのバリデーションはsaveメソッドやupdateメソッドが実行されるときに行われますが、事前にバリデーションだけを行いたい、というときには以下のようにします。(※@userはActiveModelオブジェクトです)

@user.valid?

 

バリデーションなしでsaveメソッドを実行する方法

@user.save :validate => false

 

Railsに設定したタイムゾーンで文字列をDatetime型に変換する

date = Time.parse('2013/10/23 16:53:07').to_datetime

Datetime.parse('...')としてしまうとRailsに設定したタイムゾーンを無視して変換されてしまうので注意が必要です。

 

モデルからヘルパーメソッドを呼び出す

ApplicationController.helpers.[ヘルパーメソッド名]

 

他のテーブルと結合して他のテーブルの値によってレコードを絞り込む by ActiveRecord

scope :with_role, ->(role_name) { joins(:user_roles).where(user_roles: {role: role_name})}

 

カラムを追加するときに順番を指定する

マイグレーションファイル中でafterを使って指定します。

add_colum :users, :phone_number, :string, after: :name

 

 ActiveRecordでBETWEENのように範囲を条件指定する

# 今日から1ヶ月先までに誕生日があるユーザを抽出
today = Time.current
next_month = today + 1.month
User.where(birthday: today..next_month)

 

環境

Rails 3.2.9

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です