2005-08-02 Í¥¤·¤¤Rails¤Î°é¤ÆÊý [ĹǯÆüµ]
¡ü [rails] Validations
¤¢¤ë ActiveRecord ¥ª¥Ö¥¸¥§¥¯¥È¤ÎÆâÉô¾õÂÖ¤¬´üÂÔ¤¹¤ëÃͤ«¤É¤¦¤«¤ò¸¡ºº¤¹¤ë¤Î¤¬validation µ¡Ç½¤Ç¤¹¡£Î㤨¤Ð¡¢¤¢¤ëÊÑ¿ô(¾õÂÖ)¤¬¡¢¶õÃÍ¡¢·è¤Þ¤Ã¤¿Èϰϡ¢ÆÃÄê¤ÎÀµµ¬É½¸½¤Ë¥Þ¥Ã¥Á¡¢¤Ç¤¢¤ë¤«¤É¤¦¤«¤È¤¤¤Ã¤¿¸¡ºº¤òÄêµÁ¤·¤Þ¤¹¡£ÄêµÁ¤¹¤ë¤Ë¤Ï¡¢ActiveRecord::Base#validate ¤ò override ¤·¤Þ¤¹¡£validate_on_create ¤ä validate_on_update ¤Ê¤É¤Ë´Ø¤·¤Æ¤âƱÍͤǤ¹¡£
- validate_on_create: ¥ª¥Ö¥¸¥§¥¯¥È¤¬¿·µ¬¤ËºîÀ®¤µ¤ì¤¿¤È¤¤Ë¤Î¤ß¼Â¹Ô¤µ¤ì¤Þ¤¹
- validate_on_update: ¥ª¥Ö¥¸¥§¥¯¥È¤¬¹¹¿·¤µ¤ì¤¿¤È¤¤Î¤ß¼Â¹Ô¤µ¤ì¤Þ¤¹
- validate: ¿·µ¬¡¦¹¹¿·¤Î¤É¤Á¤é¤Î¾ì¹ç¤Ç¤â¼Â¹Ô¤µ¤ì¤Þ¤¹
validate ¤È validate_on_* ¤ÎξÊý¤¬ÄêµÁ¤µ¤ì¤¿¾ì¹ç¤Ï¡¢validate ¤ÎÊý¤¬Àè¤Ë¼Â¹Ô¤µ¤ì¤Þ¤¹¡£
¡ü validate ¤ÎÄêµÁ
¤Ç¤Ï¡¢validate ¤òÄêµÁ¤·¤Æ¤ß¤Þ¤¹¡£¥¨¥é¡¼(¤¤¤ï¤æ¤ëÁÛÄê³°¤ÎÃÍ)¤¬È¯À¸¤·¤¿¾ì¹ç¤Ï¥¨¥é¡¼½èÍýÍÑ¥ª¥Ö¥¸¥§¥¯¥È(errors)¤òÍøÍѤ¹¤ë¤³¤È¤¬¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤¹¡£É¬¿Ü¤Ç¤Ï¤Ê¤¤¤Î¤Ç¼«Á°¤Ç´ÉÍý¤·¤Æ¤âÂç¾æÉפÀ¤È»×¤¤¤Þ¤¹¤¬¡¢errors ¤òÍøÍѤ¹¤ë¤È°Ê²¼¤Î2ÅÀ¤Î¥á¥ê¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£
- °ìÈÌŪ¤Ê¸¡¾Úµ¡Ç½¤¬¥á¥½¥Ã¥É¤ÇÍѰդµ¤ì¤Æ¤¤¤ë¡£
- helper ¤Î error_messages_for ¤Ë¤è¤ë¥¨¥é¡¼É½¼¨¤Î²¸·Ã¤ò¼õ¤±¤é¤ì¤ë¡£
¤Þ¤º¤Ï¡¢´Êñ¤ÊÆþÎÏ¥Á¥§¥Ã¥¯¤ò¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£
class Berryz < ActiveRecord::Base
def validate
if name.to_s.empty?
errors.add(:name, "¤¬ÆþÎϤµ¤ì¤Æ¤¤¤Þ¤»¤ó")
end
end
errors ¤òÍøÍѤ¹¤ë¾ì¹ç¤Ï¡¢¤³¤Î¤è¤¦¤Ë add ¥á¥½¥Ã¥É¤Ç¥¨¥é¡¼¾ðÊó¤òÄɲ䷤Ƥ¤¤¤Þ¤¹¡£Âè°ì°ú¿ô(ɬ¿Ü)¤Ë¤Ï¥¨¥é¡¼¤Îµ¯¤¤¿Í×ÁÇ̾(¥«¥é¥à̾)¤òÆþ¤ì¡¢ÂèÆó°ú¿ô(¾Êά²Ä)¤Ë¤Ïɽ¼¨¤¹¤ë¥á¥Ã¥»¡¼¥¸¤òÆþ¤ì¤Þ¤¹¡£¾Êά¤¹¤ë¤È¥Ç¥Õ¥©¥ë¥È¤Î±Ñ¸ì¤Î¥á¥Ã¥»¡¼¥¸¤Ë¤Ê¤ê¤Þ¤¹¡£
¡ü ¥á¥ê¥Ã¥È1: °ìÈÌŪ¤Ê¸¡¾Úµ¡Ç½
º£¤Î¶õʸ»úÎó¥Á¥§¥Ã¥¯¤âÁȤ߹þ¤ß¤Ç½àÈ÷¤µ¤ì¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢errors¤òÍøÍѤ¹¤ë¾ì¹ç¤Ï¤½¤ì¤òÍøÍѤ¹¤ëÊý¤¬¤è¤¤¤Ç¤·¤ç¤¦¡£
class Berryz < ActiveRecord::Base
def validate
errors.add_on_empty %w( name ), "¤¬ÆþÎϤµ¤ì¤Æ¤¤¤Þ¤»¤ó"
end
end
Âè°ì°ú¿ô¤Ë¥Á¥§¥Ã¥¯¤·¤¿¤¤¥«¥é¥à̾(¤â¤·¤¯¤Ï°À̾)¤òÎóµó¤Ç¤¤ë¤Î¤Ç¡¢Ê£¿ô¤Î¹àÌܤò¸¡ºº¤¹¤ë¤È¤¤Ëµ½Ò¤¬¤¹¤Ã¤¤ê¤·¤Þ¤¹¡£°Ê²¼¤Î¸¡¾Úµ¡Ç½(errors¤Î¥á¥½¥Ã¥É)¤¬ÍøÍѲÄǽ¤Ç¤¹¡£
- add_on_blank # Rails³ÈÄ¥Object¤ÎObject#blank? ¤Ë¤è¤ë¸¡ºº ("", " ", nil, 0)
- add_on_boundary_breaking # Èϰϥª¥Ö¥¸¥§¥¯¥È(range)¤Ë¤è¤ë¸¡ºº
- add_on_empty # empty? ¤Ë¤è¤ë¸¡ºº
¤Þ¤¿¡¢¤É¤Î¥«¥é¥à¤Ë¤â·ë¤Ó¤Ä¤«¤Ê¤¤¤±¤É¥¨¥é¡¼¤òɽ¼¨¤µ¤»¤¿¤¤¾ì¹ç¤Ï¡¢
- add_to_base
¤òÍøÍѤ·¤Þ¤¹¡£°Ê²¼¡¢ÍøÍÑÎã¤Ç¤¹¡£
class Berryz < ActiveRecord::Base
def validate
errors.add_on_blank %w( name ), "¤¬ÆþÎϤµ¤ì¤Æ¤¤¤Þ¤»¤ó"
errors.add_on_boundary_breaking %w( password ), (1..8), "¤Î¥µ¥¤¥º¤¬¾å¸Â(%d)¤òͤ¨¤Æ¤¤¤Þ¤¹"
rescue
errors.add_to_base "²¿¤«ÍͻҤ¬ÊѤǤ¹"
end
end
¡ü ¥á¥ê¥Ã¥È2: ¥¨¥é¡¼É½¼¨µ¡Ç½(error_messages_for)
edit.rhtml ¤ÎÃæ¤Ë <%= error_messages_for :berryz %> ¤òÄɲ䷤Ƥߤޤ·¤ç¤¦¡£¤³¤Î¥Ø¥ë¥Ñ¡¼¥á¥½¥Ã¥É¤Ï errors ¥ª¥Ö¥¸¥§¥¯¥È¤ÎÍ×ÁǤ¬¶õ¤Ç¤Ê¤¤¤È¤¤Ë¡¢¼«Æ°Åª¤Ë·Ù¹ðÍѤÎʸ¸À¤òÊÖ¤·¤Þ¤¹¡£°ú¿ô¤Ë¤Ï edit ¥¢¥¯¥·¥ç¥ó¤ÇÍøÍѤ·¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È(¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô)¤Î̾Á°¤¬Æþ¤ê¤Þ¤¹¡£ºîÀ®¤·¤¿¥â¥Ç¥ë(AcitveRecord¤Î¥µ¥Ö¥¯¥é¥¹)¤Î̾Á°¤Ç¤Ï¤Ê¤¤¤Î¤ÇÃí°Õ¤·¤Þ¤·¤ç¤¦¡£
# app/views/berryz/edit.rhtml <%= stylesheet_link_tag 'scaffold' %> # ¢« public/stylesheets/scaffold.css ¤òÍѰդ·¤Æ¤ª¤¯(¿§ÉÕ¤±ÍÑ) <%= start_form_tag :action => 'update', :id => @berryz %> <%= error_messages_for 'berryz' %> <p>̾Á°: <%= text_field 'berryz', 'name' %></p> <p>¥Ñ¥¹¥ï¡¼¥É: <%= text_field 'berryz', 'password' %></p> <%= submit_tag 'ÅÐÏ¿' %> <%= end_form_tag %>
¤¹¤ë¤È¡¢error_messages_for Éôʬ¤Ë¤³¤Î¤è¤¦¤Ê¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£

scaffold.css ¤Î¾ì½ê¤ä error_messages_for Åù¤Î½ñ¼°¤¬¤ï¤«¤ê¿É¤¤¾ì¹ç¤Ï¡¢°ìÅÙ generate scaffold ¤Ç¥Æ¥ó¥×¥ì¡¼¥È°ì¼°¤òºî¤Ã¤Æ¤ß¤ë¤È¤è¤¤¤Ç¤·¤ç¤¦¡£¤½¤Î¾ì¹ç¡¢app/views/(¥â¥Ç¥ë̾)/_form.rhtml ¤¬¾åµ¤Î edit.rhtml ¤ËÁêÅö¤·¤Þ¤¹¡£
¡ü Àë¸ÀŪ¤ÊÄêµÁ
º£¤Þ¤Ç¤Ï¥¤¥ó¥¹¥¿¥ó¥¹¥á¥½¥Ã¥É¤È¤·¤Æ validate* ¤òÄêµÁ¤·¤Æ¤¤Þ¤·¤¿¤¬¡¢Rails ¤ªÆÀ°Õ¤Î´Ø¿ô·¿¤È¤¤¤¦¤«Àë¸ÀŪ¤ÊÄêµÁ¤Ç¤â²Äǽ¤Ç¤¹¡£
class Account < ActiveRecord::Base
validates_presence_of :subdomain, :name, :email_address, :password
validates_uniqueness_of :subdomain
validates_acceptance_of :terms_of_service, :on => :create
validates_confirmation_of :password, :email_address, :on => :create
end
к¡Çw¡Ç) ¡ã¤³¤¦¤¤¤¦½ñ¼°¤Ã¤ÆRails¤Ç¿ÍѤµ¤ì¤Æ¤ë¤è¤Í¡¼¡£
Àî¡¡¦_¡¦¡®Àî¡ã³Î¤«¤Ëñ½ã¤Ê¤â¤Î¤Ê¤é¥á¥½¥Ã¥É¤è¤ê¤â¸«±É¤¨¤Ï¤¤¤¤¤±¤É¡£
ŽÙ üý-üýŽØ ¡ã¥í¥¸¥Ã¥¯¤¬Æþ¤Ã¤ÆÄ¹¤¯¤Ê¤ë¤ÈµÕ¤Ë²ÄÆÉÀ¤ò»¤Ê¤¦½ô¿Ï¤Î·õ¡£
кoŽß¡¼Žßк ¡ã°Õ¿ÞÄ̤ê¤Î validation ¤Î¸¡ººµ¡Ç½¥á¥½¥Ã¥É¤¬¤Ê¤¤¤È»È¤¨¤Ê¤¤¤Î¤Ç¤¹¡£
к ¡¢à¡®Ðº¡ã±Ñ¸ì¤ÈÆüËܸì¤Î°ã¤¤¤â¤¢¤ë¤«¤â¤·¤ì¤Ê¤¤¤±¤É¡¢¤Ê¤«¤Ê¤«¥Õ¥£¥Ã¥È¤·¤Ê¤¤¤Ç¤¹¤Í¡¼¡£
ŽÉŽÉl¢ß_¢ß'ŽÙ ¡ã¤³¤³¤é¤Ø¤ó¤Î presence, uniqueness, ... ¤Ï¥¤¥ó¥¹¥¿¥ó¥¹¥á¥½¥Ã¥É¤Ç¤ÏÍѰդµ¤ì¤Æ¤Ê¤¤¤·¡£
½£*¡Æ o¡ÆŽØ ¡ãÈù̯¤Ç¤¹¡¼¡£
ŽÉŽÉl¢ß_¢ß'ŽÙ ¡ã¤Ç¡¢uniqueness ¤ÏÁ´·ï¥µ¡¼¥Á¤¹¤ë¤Î¤Ç index Ä¥¤Ã¤Æ¤Ê¤¤¥«¥é¥à¤Ç»È¤Ã¤Á¤ã¤¦¤È¡¢¡¢¡¢
½£*¡Æ o¡ÆŽØ ¡ãÉݤ¤¤ó¤Ç¤¹¤±¤É¡£ËÜÅö¤ËÉݤ¤¤ó¤Ç¤¹¤±¤É¡£
¡Ê¡(Ž´)¡®¡Ë޲¡ã¤½¤·¤Æ¡¢index ¤òÄ¥¤ë¤Ê¤é¤½¤Î¤Þ¤Þ unique index ¤Ë¤¹¤ë¥¯¥Þ¡¼¡£
ŽÙ üý-üýŽØ ¡ã¤³¤ìÁ´ÉôÍפé¤Ê¤¤¤«¤é ActiveRecord::Errors#add_on_regexp ¤¤Ü¤ó¡£
ŽÉŽÉl¢ß_¢ß'ŽÙ ¡ã¤³¤¦¤¤¤¦Àë¸À¤À¤±¤Çºî¤ì¤¿¤é³Î¤«¤Ë¥³¡¼¥É¤Ï¤«¤Ã¤³¤¤¤¤¤±¤É¡¢¡¢¡¢
½£*¡Æ o¡ÆŽØ ¡ã¤½¤¦¤ä¤Ã¤Æ°ìÈÖ¤¦¤Þ¤¯¤¤¤Ã¤¿Îã(¥³¡¼¥É)¤ò¡ÖRails¤ÎÀ¸»ºÀ¡×¤È¤·¤Æëð¤¦Î®¤ì¤Ë¤Ê¤ë¤Î¤Ï·ù¤À¤è¤Í¡£
ŽÙ üý-üýŽØ ¡ãRails²ûµ¿ÇɤοͤϤ½¤¦¤¤¤¦Æ÷¤¤¤ò´¶¤¸¤Æ¤ë¤Î¤«¤â¡£(»²¹Í: http://funk.exblog.jp/2335721/ )
¡Ê¡(Ž´)¡®¡Ë޲¡ãscaffold ¤ÎÆ÷¤¤¤¬¤¹¤ë¥¯¥Þ¡¼¡£
ŽÉŽÉl¢ß_¢ß'ŽÙ ¡ãscaffold 1¹Ô¤Ç½ñ¤±¤ë¤³¤È¤è¤ê¤â¡¢scaffold ¤¬ºî¤Ã¤¿¥á¥½¥Ã¥É¤ÎÃæ¤Ë¶Å½Ì¤µ¤ì¤Æ¤ë¥³¡¼¥É¤ÎÊý¤¬Rails¤ÎËܼÁ¤À¤è¤Í¢ö
½£*¡Æ o¡ÆŽØ ¡ã¤¦¤ó¡£¤¢¤Î list, show, edit, destroy ¤¬ËؤÉ1¹Ô¤ÊÊý¤¬À¨¤¤¤è¤Í¡£
к¡Çw¡Ç) ¡ã·ë²ÌŪ¤ËÀë¸ÀŪ¤Ê¤é¤¤¤¤¤±¤É¡¢¤½¤³¤¬ÌÜŪ¤Ë¤Ê¤é¤Ê¤¤¤è¤¦¤Ë¤·¤¿¤¤¤Í¢ö
¡ü ¥á¥Ã¥»¡¼¥¸¤ÎÆüËܸ첽
°ìÉô¤ÏÆüËܸì¤Ë¤Ê¤ê¤Þ¤·¤¿¤¬¡¢¥á¥Ã¥»¡¼¥¸¤ò´°Á´¤ËÆüËܸ첽¤¹¤ë¤Ë¤Ï¼¡¤Î3¤Ä¤Î´ØÌç¤òÆÍÇˤ·¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£(Rails¤Ï¤Þ¤ÀóÕÌÀ´ü¤Ê¤Î¤Ç localization ¤¬µ´Ìç¤Ç¤¹)
- ¥¨¥é¡¼¤ÎÆâÍÆ¾ÜºÙ¥á¥Ã¥»¡¼¥¸
- ¥¨¥é¡¼¤Î¥«¥é¥à̾(¾å¤Î "Password" ¤ÎÉôʬ)
- ¥¨¥é¡¼¤Î¥¿¥¤¥È¥ë(¸«½Ð¤·)
1¤Ï´û¤ËÂбþ¤·¤Þ¤·¤¿¤¬¡¢@@default_error_messages¤Ë¤è¤Ã¤Æ¤Þ¤È¤á¤ÆÀßÄꤹ¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¤Î¤Ç¡¢¤½¤Á¤é¤â¾Ò²ð¤·¤Þ¤¹¡£
module ActiveRecord
class Errors
@@default_error_messages = {
:empty => "¤¬ÆþÎϤµ¤ì¤Æ¤¤¤Þ¤»¤ó",
:invalid => "¤¬ÉÔÀµ¤ÊÃͤǤ¹",
:too_long => "¤Î¥µ¥¤¥º¤¬¾å¸Â(%d)¤òͤ¨¤Æ¤¤¤Þ¤¹",
# :inclusion => "is not included in the list",
# :exclusion => "is reserved",
# :invalid => "is invalid",
# :confirmation => "doesn't match confirmation",
# :accepted => "must be accepted",
# :empty => "can't be empty",
# :blank => "can't be blank",
# :too_long => "is too long (max is %d characters)",
# :too_short => "is too short (min is %d characters)",
# :wrong_length => "is the wrong length (should be %d characters)",
# :taken => "has already been taken",
# :not_a_number => "is not a number",
}
end
end
2¤Ï Rails ¦¤Ë¤ÏÍѰդµ¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ç¡¢ActiveRecord.human_attribute_name¤ò̵ÍýÌðÍý¾è¤Ã¼è¤ë¤³¤È¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ï "user_name" ¢ª "User Name" ¤Î¤è¤¦¤Ë¥«¥é¥à̾¤ò¿Í¤¬ÆÉ¤ß¤ä¤¹¤¤·Á¤ËÊÑ´¹¤¹¤ë¥á¥½¥Ã¥É¤Ê¤Î¤Ç¡¢É½¼¨Éôʬ°Ê³°¤Ç¤Ï»È¤ï¤ì¤Ê¤¤¤Ï¤º¤À¤È´üÂԤǤ¤Þ¤¹¡£(¾ÍèŪ¤Ë»ÅÍͤ¬Êѹ¹¤µ¤ì¤Æ¤â¤³¤ÎÆüËܸ첽¤¬Ìµ¸ú¤Ë¤Ê¤ë¤°¤é¤¤¤Ç¸íưºî¤Î¿´ÇۤϤʤ¤¤Ç¤·¤ç¤¦)¡£
class Kids < ActiveRecord::Base
class << self
HUMANIZED_ATTRIBUTE_KEY_NAMES = {
"name" => "̾Á°",
"password" => "¥Ñ¥¹¥ï¡¼¥É",
}
def human_attribute_name(attribute_key_name)
HUMANIZED_ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
end
end

¤³¤³¤Þ¤Ç¤¤¿¤é¸å¤Ï¸«½Ð¤·¤Îɽ¼¨Éôʬ¤Î3¤ò»Ä¤¹¤Î¤ß¤Ç¤¹¡£¤³¤ì¤Ïʸ»úÎó¤òÃÖ¤´¹¤¨¤ë¤À¤±¤Ê¤Î¤Ç³Ú¾¡¤Ç¤·¤ç¤¦¡£¥³¡¼¥Ò¡¼¤Ç°ìÉþ¤·¤Ê¤¬¤é "There were problems with the following" ¤ò grep¤·¤Æ¥½¡¼¥¹¤òõ¤¹¤³¤È¤Ë¤·¤Þ¤·¤ç¤¦¡£

к¡ô¡Çw¡Ç) ¡ã¤Ê¤ó¤¸¤ã¤³¤ê¤ã¡¼¡ª¡ª
½£*;¡Æ o¡ÆŽØ ¡ãÎϰìÇÕËä¤á¹þ¤ó¤Ç¤¢¤ë¤ó¤Ç¤¹¤±¤É¡¢¡¢¡¢
ŽÙ üý-üýŽØ ¡ã½ªÎ»¡Á¡£
Àî¡¡¦_¡¦¡®Àî¡ã°ì±þÊó¹ð http://dev.rubyonrails.com/ticket/1089 ¤Ï¤µ¤ì¤Æ¤Þ¤¹¤Í¡£
кoŽß¡¼Žßк ¡ã¤Ç¤ì¤Ç¤ì¡Á¡¢¤¢¤¥¤¢¤¥¤¢¡Á¢ö
<%= error_messages_for(:berryz).sub(/There were problems with the following fields:/,
"¤³¤Î¥Õ¥£¡¼¥ë¥É¤ÏÌäÂ꤬¤¢¤ë¤È¤æ¤¤¤¿¤¤¤Ç¤¹") %>
ŽÉŽÉl;¢ß_¢ß'ŽÙ ¡ã¤Þ¡¼¤µ¤Á¤ã¤ó¡¢¾Ð´é¤Ç²¿¤Ö¤Ã¤½¤¦¤Ê¤³¤È¤ä¤Ã¤Æ¤ë¤Î¡ª
кoT¡¼Tк¡ã¤¢¤¦¤¡¡Á¡¢¤¢¡Á¤Ð¤Ð¤¦¡Á¤¢¡Á¤¢¡Á¤¦¡Á
к ¡¢à¡®Ðº¡ã¤Þ¡¼¤µ¤ÏÌÀÆü¤¬Ç¼ÉʤǾǤäƤë¤ó¤À¤è¤Í¡¼¡£
½£*¡Æ o¡ÆŽØ ¡ã²Ä°¥ÁÛ¤À¤«¤é ApplicationHelper ¤Ë¥á¥½¥Ã¥Éºî¤í¤Ã¤«¡£
ŽÉŽÉl¢ß_¢ß'ŽÙ ¡ã¤¸¤ã¤¢¡¢¤ê¡¼¡¢¤ª´ê¤¤¤Í¡£»ä¤Ï view ºî¤ë¤«¤é¡£
# app/helpers/application_helper.rb
def template_error_messages_for (object_name, options = {})
options = options.symbolize_keys
object = instance_variable_get("@#{object_name}")
unless object.errors.empty?
render :partial=>"system/error_messages_for",
:locals=>{:messages=>object.errors.full_messages, :object=>object}
end
end
# app/views/system/_error_messages_for.rhtml
<div class="errorExplanation" id="errorExplanation">
<h2><%= messages.size %>¸Ä¤Î¥¨¥é¡¼¤¬È¯À¸¤·¤Þ¤·¤¿</h2>
<p>¼¡¤Î¹àÌܤËÌäÂ꤬¤¢¤ê¤Þ¤¹</p>
<ul>
<% for mes in messages %><li><%= mes %></li><% end %>
</ul>
</div>
к¡Çw¡Ç) ¡ã¤³¤Î template_error_messages_for ¤òÊѤï¤ê¤Ë»È¤¨¤Ð¤¤¤¤¤ó¤À¤Í¢ö

к¡Çw¡Ç) ¡ã¥Ç¥ì¥Ç¥ì!!¥·¥ó¥Ç¥ìLOVE!!


½é¤á¤Þ¤·¤Æ¡£<br>message¤ÎÆüËܸ첽¡¢»²¹Í¤Ë¤µ¤»¤Æ¤¤¤¿¤À¤¤Þ¤·¤¿¡£<br>µ®½Å¤ÊÆüËܸì¤Î¾ðÊ󤢤꤬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£<br><br>»ä¤Îºî¶ÈÆüµ¤«¤é¾ðÊ󻲾ȥµ¥¤¥È¤È¤·¤Æ¾¡¼ê¤Ê¤¬¤é¤³¤ÎÆüÉÕ¤Î¥Ö¥í¥°¤ØÄ¾¥ê¥ó¥¯¤òޤ餻¤Æ¤¤¤¿¤À¤¤Þ¤·¤¿¡¦¡¦¡¦¡£<br>¤â¤·²¿¤«ÌäÂ꤬¤¢¤ë¤è¤¦¤Ç¤·¤¿¤é¤ª¼ê¿ô¤Ç¤¹¤¬¡¦¡¦¡¦°ì¸À¤ª´ê¤¤¤·¤Þ¤¹¡£ttp://d.hatena.ne.jp/catalina/20050929