前回のところでデータが登録できるところまで行きました。
ただこの状態だと内容すっからかんのデータも登録できてしまうため、バリデーションを登録します。
どうやら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