破いて捨てたノート

Webやテクノロジーやそれ以外に関する思いつき

validationに`:if` optionを渡すと、viewの`requuired: true`が自動でつかなくなる?

Railsのmodelでpresence validationを書いて、

# model
validates :username, presence: true

そのattributeに対応するformの入力欄をこんな風に書くと

# view
- form_for @user
 = f.text_field :username

だいたいこんなようなHTMLが生成される。

<input id="user_username" name="user[username]" required="required" size="30" type="text" />

validationでpresence: true と書いておくと、view側で:required optionを書いてあげなくても、HTML側がrequired="required"になってくれるようだ。

ただ、validationに:if optionを渡すとそうはいかないらしい。

# model
validates :password, presence: true, if: :password_required?

def password_required?
  ...
end
# view
- form_for @user
 = f.text_field : password
<input id="user_ password" name="user[password]" size="30" type="text" />

oh!!
validationに:ifを使うときは、viewにrequired optionをつけてあげましょう。

# view
- form_for @user
 = f.text_field : password, required: true

ref: http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates

追記 2014-03-20

Railsに詳しい方からコメントを頂ました。
(コメントをするには、はてなへのログインが必要であり、面倒なため、チャットにてコメントを頂きました。こちらに転載させて頂きます。)

validationでpresence: true と書いておくと、view側で:required optionを書いてあげなくても、HTML側がrequired="required"になってくれるようだ。

f:id:yachibit:20140320013221p:plain

ご本人が作られたhtml5_validatorsのことです。

f:id:yachibit:20140320013228p:plain

https://github.com/rails/rails/pull/3590

f:id:yachibit:20140320013234p:plain

誤った情報を記してしまい、大変失礼しました。 貴重なコメントありがとうございました。

Rails3レシピブック 190の技

Rails3レシピブック 190の技