カテゴリー : Ruby

[Ruby on Rails] 日付・時刻のバリデーションなら「ValidatesTimeliness」

Ruby on Rails で、日付・時刻のバリデーションをするなら ValidatesTimeliness という gem がおすすめです。

ActiveRecord だけでなく Mongoid でも使えるみたい。

adzap/validates_timeliness · GitHub はてなブックマーク - adzap/validates_timeliness · GitHub

validates_timeliness gem をインストール後、日本語のエラーメッセージを最低限、設定します。

# config/locales/model.ja.yml
ja:
  activerecord:
    errors:
      messages:
        invalid_date: は正しい形式で入力してください。
        invalid_time: は正しい形式で入力してください。
        invalid_datetime: は正しい形式で入力してください。

基本的な設定はこれだけで、あとはモデルに validates_datetime とかでバリデーションを設定できます。

# app/models/article.rb
class Article < ActiveRecord::Base
  validates_datetime :published_at
  validates_date :published_date
  validates_time :published_time
end

日付や時刻のバリデーションフォーマットがデフォルトのものだけでは、足りない場合は、独自定義したフォーマットを追加することもできます。

Plugin Parser を config.use_plugin_parser = true でONにして、config.parser.add_formats で追加するだけです。

# config/initializers/validates_timeliness.rb
ValidatesTimeliness.setup do |config|
 
  config.use_plugin_parser = true
  config.parser.add_formats(:time, "%H:%M")
 
end

上記は、Time に「01:23」みたいなフォーマットも許可する設定です。

もっと詳しい情報はWikiを見てください。

Plugin Parser · adzap/validates_timeliness Wiki はてなブックマーク - Plugin Parser · adzap/validates_timeliness Wiki

ValidatesTimeliness は、Date/time parser に timeliness を使ってるので、デフォルトのフォーマットは timeliness のページから確認できます。

timeliness/README.rdoc at master · adzap/timeliness · GitHub はてなブックマーク - timeliness/README.rdoc at master · adzap/timeliness · GitHub

ValidatesTimeliness 便利ですね。

日付や時刻のフォーマットって普遍だと思うので、Railsにデフォルトで搭載されていても良さそうなのに何でないんでしょうね?

[Ruby on Rails] view で現在のコントロール名、アクション名を取得する方法

Ruby on Rails で、view で現在のコントロール名、アクション名を取得する方法をメモ。

controller.controller_name
controller.action_name

[参考]:Railsのviewで現在のコントロール名、アクション名を参照する方法 #Rails – Qiita はてなブックマーク - Railsのviewで現在のコントロール名、アクション名を参照する方法 #Rails - Qiita

[Ruby] 時刻のフォーマットをチェックする正規表現

Ruby で、時刻のフォーマットをチェックする正規表現をメモ。

Rails でバリデーターとして使う場合はこんな感じ。

# 時刻が正しい形式かチェックする
def validate_format_for_time
  return if time.blank?
 
  unless time =~ /^([0-1][0-9]|[2][0-3]):[0-5][0-9]$/
    errors.add(:time, "を正しい形式で入力してください。")
  end
end

[RSpec] コントローラーのテストで Ajax リクエストを送る方法

RSpec で、コントローラーのテストで Ajax リクエストを送るには xhr を使えば良いらしいです。

■ Ajax GET

xhr :get, :index

■ Ajax POST

xhr :post, :create, id: 1

下記のような感じで使えます。カンタンですね!

describe "Ajax GET 'index'" do
  it "returns http success" do
    xhr :get, :index
    response.should be_success
  end
end

・[参考]:ruby on rails – How do you test an AJAX request with RSpec/RoR? – Stack Overflow はてなブックマーク - ruby on rails - How do you test an AJAX request with RSpec/RoR? - Stack Overflow

[Ruby on Rails] validates numericality で nil はチェックしない方法

Ruby on Rails で、validates numericality で nil の場合、チェックしないようにするには allow_nil: true を指定すればOKです。

class Article < ActiveRecord::Base
  validates :page_view, numericality: true, allow_nil: true
end

allow_nil: true を指定しない場合は、未入力でも「xxx は数字で入力してください。」というバリデーションエラーになってしまいます。

・[参考]:validation – custom error message for valid numericality of in rails – Stack Overflow はてなブックマーク - validation - custom error message for valid numericality of in rails - Stack Overflow

[Ruby on Rails] .build や build_xxx について

Ruby on Rails の .build や build_xxx についてメモ。

build メソッドはググれば見つかるけど、「build_xxx って何だ?」と思って調べてみました。

build_xxx は has_one でアソシエーションが定義されている場合に使える構文らしく、

tag = @article.tag.build

と書くのを、

tag = @article.build_tag

という風に書くこともできるみたいです。

ちなみに build は、親モデルに対する外部参照キーを自動でセットしてくれる点が new メソッドと違って便利!

詳しくはこの辺を読む。

build (ActiveRecord::Relation) – APIdock はてなブックマーク - build (ActiveRecord::Relation) - APIdock

Ruby on Rails 備忘録 – Ride On Rails » Blog Archive » ActiveRecord の new と build の違い はてなブックマーク - Ruby on Rails 備忘録 – Ride On Rails » Blog Archive » ActiveRecord の new と build の違い

[Ruby on Rails] 複雑な検索フォームを簡単に作成することができる「Ransack」

Ruby on Rails で、複雑な検索フォームを簡単に作成することができる「Ransack」というGemが便利なのでメモ。

ernie/ransack · GitHub はてなブックマーク - ernie/ransack · GitHub

Home · ernie/ransack Wiki はてなブックマーク - Home · ernie/ransack Wiki

#370 Ransack – RailsCasts はてなブックマーク - #370 Ransack - RailsCasts

Ransackのススメ #Rails #ransack #Ruby – Qiita はてなブックマーク - Ransackのススメ #Rails #ransack #Ruby - Qiita

[Ruby on Rails] 単一カラムの配列を作るなら pluck メソッドが便利

Ruby on Rails 3.2 から追加された新機能 pluck メソッドが便利です。

pluck (ActiveRecord::Calculations) – APIdock はてなブックマーク - pluck (ActiveRecord::Calculations) - APIdock

こんな風に map で単一カラムの配列を作っていたのを、

blog_titles = Blog.all.map(&:title)

pluck メソッドを使えば、こんな感じに書ける。

blog_titles = Blog.pluck(:title)

しかも、パフォーマンスが良いということで、pluck を使わないわけにはいかない。

Rails3.2から導入されたpluckメソッドのパフォーマンスが素晴らしい件 – (゚∀゚)o彡 sasata299’s blog はてなブックマーク - Rails3.2から導入されたpluckメソッドのパフォーマンスが素晴らしい件 - (゚∀゚)o彡 sasata299's blog

_人人人人人人人人人_
> pluck ステキ! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y ̄

#318 Upgrading to Rails 3.2 – RailsCasts はてなブックマーク - #318 Upgrading to Rails 3.2 - RailsCasts

[Ruby] state_machine の国際化対応 (i18n)

state_machine の国際化対応 (i18n)の方法をメモ。

pluginaweek/state_machine · GitHub はてなブックマーク - pluginaweek/state_machine · GitHub

■ config/locales/model.ja.yml

ja:
  activerecord:
    state_machines:
      order:
        state:
          states:
            accepted: 注文受付
            firmed: 注文確定
            cancelled: 注文キャンセル
            delivered: 発送完了
          events:
            accept: 注文
            cancel: キャンセル
            deliver: 発送
    errors:
      models:
        order:
          attributes:
            state:
              invalid_transition: "%{value}状態では%{event}処理はできません。"

そんでもって、human_state_name で使う。

o.human_state_name
# => "発送完了"

【参考】

I18n documentation is missing · Issue #114 · pluginaweek/state_machine はてなブックマーク - I18n documentation is missing · Issue #114 · pluginaweek/state_machine

[Ruby on Rails] seed_fu を環境毎に分ける

Ruby on Rails で seed_fu のファイルを開発環境毎に分けてみました。

% ls -l db 
total 64
drwxr-xr-x  11 shigeoka  staff    374  1 29 20:10 fixtures/
drwxr-xr-x   3 shigeoka  staff    102 12 27 18:16 fixtures_development/
drwxr-xr-x   3 shigeoka  staff    102  1 30 18:07 fixtures_production/
drwxr-xr-x   3 shigeoka  staff    102  1 30 18:06 fixtures_staging/
drwxr-xr-x  76 shigeoka  staff   2584  1 29 20:10 migrate/
-rw-r--r--   1 shigeoka  staff  18269  1 29 20:10 schema.rb
-rw-r--r--   1 shigeoka  staff    343 12  4 23:32 seeds.rb

どの環境でも共通のデータは、普通に fixtures ディレクトリ以下に設置しています。

その他は、development, staging などでインポートしたいデータが微妙に違ってくるので、suffix に環境名を付けたディレクトリを作って分けました。

それぞれの環境のseedデータをインポートするには下記のように FIXTURE_PATH を指定してあげます。

% rake db:seed_fu FIXTURE_PATH=db/fixtures_development

そんでもって、development, stagingで共通のファイルは require で読み込むようにしています。

# db/fixtures_development/users.rb
require "#{Rails.root}/db/fixtures_staging/groups.rb"

こんな感じです。