Ruby開発未経験のJava/PHPエンジニアがRuby On Railsでお問い合わせフォームを作る:バリデーション編

前回のところでデータが登録できるところまで行きました。

ただこの状態だと内容すっからかんのデータも登録できてしまうため、バリデーションを登録します。

どうやらmodelに書けば良いようです。

バリデーションのルールも結構色々用意されているみたいですね。

カスタムバリデーションや複合条件によりバリデーションのパターンも用意されているみたいです。

カスタムエラーメッセージ対応

入力必須項目のメッセージを上書きするには以下のように書きます。

  validates :name, presence:  { message: "氏名は必須です。" }

http://stackoverflow.com/questions/5386785/validation-custom-message-for-rails-3

メールアドレスバリデータ

メールアドレスのバリデータには正規表現を使う方法や、gemをインストールして使う方法などいくつかパターンがあるようです。

日本のキャリアメールとか結構独自のパターンだったりするので、自分で正規表現を書いていくほうが柔軟に対応できるかもしれません。今回は独自バリデータを用意してそれを呼ぶようにします。

app/models/concerns/email_validator.rb

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || "は正しいメールアドレスではありません")
    end
  end
end

http://qiita.com/isseium/items/a76e84687358f95a6e7e

ということでバリデートをまず以下のように定義しました。

app/models/inquiry.rb

class Inquiry < ActiveRecord::Base
  validates :name, presence: { message: "氏名は必須です。" },length: { maximum: 100 ,too_long: "%{count}文字を超えています。"}
  validates :address1, presence: { message: "住所は必須です。" },length: { maximum: 250,too_long: "%{count}文字を超えています。" }
  validates :email, presence: { message: "メールアドレスは必須です。" },email: true, length: { maximum: 250,too_long: "%{count}文字を超えています。" }
  validates :content, presence: { message: "お問い合せ内容は必須です。" }, length: { maximum: 10000,too_long: "%{count}文字を超えています。" }
  validates :zip, length: { is: 7,message: "郵便番号は%{count}桁で入力してください。"  }
  validates :prefecture, numericality: {
            only_integer: true, greater_than_or_equal_to: 0,less_than_or_equal_to: 50,message: "都道府県を選択してください。"
          }
end

https://github.com/YoshiteruIwasaki/banana-mail/commit/e090d500faefd356ad87a178c6537885114ebf69

多言語対応

さて、バリデータ内にメッセージを入れてしまうと多言語化対応がしづらくなってしまいます。

ある程度多言語化対応をしておきます。

https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

をダウンロードして

config/locales/ja.yml

に配置します。

config/application.rb

を以下のように書き換えます。

    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de
    config.i18n.default_locale = :ja

config/locales内のrb,ymlファイルは自動的に読み込んでくれるようです。

サーバーを再起動すれば反映されます。

modelの項目も多言語化設定ができます。

  activerecord:
    models:
      inquiry: お問い合わせ
    attributes:
      inquiry:
        name: 氏名
        zip: 郵便番号
        prefecture: 都道府県
        address1: 住所
        address2: マンション・アパート名
        email: メールアドレス
        content: お問い合せ内容

言語設定に引数を渡す場合は次のように書きます。

I18n.t('errors.messages.invalid_email', :attribute => attribute)

https://github.com/YoshiteruIwasaki/banana-mail/commit/3e491ebda4b1d06663ca387c45fd54b95f9805dc

参考

http://ruby-rails.hatenadiary.com/entry/20140724/1406145303#model-validation-definettions-presence

http://qiita.com/shunhikita/items/772b81a1cc066e67930e

http://railsdoc.com/validation#%E5%80%A4%E3%81%8C%E7%A9%BA%E3%81%A7%E3%81%AA%E3%81%84%E3%81%8B(presence)

http://railsguides.jp/active_record_validations.html

http://www.geekzshu.com/rails/1254

http://qiita.com/awakia/items/cab830238bbfaa924f02

http://qiita.com/yutackall/items/0ff97132f31e5bacbf00

http://rails3try.blogspot.jp/2012/01/rails3-i18n.html

http://takuyan.hatenablog.com/entry/20111120/1321741426