å°æ±æ¸ã®åå¼·ä¼ã§ããªãã¼ã·ã§ã³ãã£ãã
小江戸らぐã®Railsåå¼·ä¼ã§ä»æã¯validationãããã¾ããã
æåã«ãMVCã®æå³ãç°¡åã«èª¬æãã¦ãä»åã¯ãMVCã®ä¸ã®
Modelé¨åã®ããªãã¼ã·ã§ã³ãããã¾ããã¼ã¨èª¬æãããã©ãçç¥ã
ã§ãããªãã¼ã·ã§ã³ã®æç¾©ã£ã¦ï¼
æ²ç¤ºæ¿ã®ã¢ããªã±ã¼ã·ã§ã³ãä½ã£ãã¨ããæ¸ãè¾¼ã¾ããå
容ã¯ããã¼ã¿ã¨ãã¦ä¿åãã¾ããã
ãã®æç¨¿ã®ä¸ã«ãååãç¡ãã£ãããã¡ã¼ã«ã¢ãã¬ã¹ã䏿£ã ã£ãããæç« ãç¡ãã£ããããå ´åã
ãã¼ã¿ã¨ãã¦ä¿åããããªãã§ãããã
ããããã¨ãã«ãååã¯å¿
ãå
¥ãã¦ããã£ãããã¡ã¼ã«ã¢ãã¬ã¹ãæ£è¦è¡¨ç¾éãã確èªãã¦ã
ãã¼ã¿ãä¿åãã¦è¯ãã夿ãããçºã«å®è£
ã§ãã¾ãã
ã¨è¨ãããã§ãå°æ±æ¸ããã¡ã³ãã¼è¡¨ãä½ã£ã¦ã¿ã¾ãããã
ã¡ã³ãã¼è¡¨ãä½ãã®ã«å¿ è¦ãªãã¼ã¿å®ç¾©ãã¿ããªã§èãã¦è¦ã¾ããã
ã¾ãé ç®ãèããã
çªå· | é ç® |
---|---|
1 | åå |
2 | å¹´é½¢ |
3 | é ã飲ããã |
4 | æ§å¥ |
5 | èªå·±ç´¹ä» |
6 | ã¡ã¢ã |
ã§ãããã«ã«ã©ã åã¨ç¨®é¡ãå®ç¾©ãã¦ããã¾ããã
æ§å¥ã«ã¤ãã¦ã¯ãç·ã女ããããæ§ã«ãvalidationã®ä¸é¨ã®æ©è½ãç´¹ä»ãããçºã«ããã¦textåã«*1
çªå· | é ç® | ã«ã©ã å | ç¨®é¡ |
---|---|---|---|
1 | åå | name | string |
2 | å¹´é½¢ | age | integer |
3 | é ã飲ããã | drink | boolean |
4 | æ§å¥ | sex | string |
5 | èªå·±ç´¹ä» | discription | text |
6 | ã¡ã¢ã | string |
ã¨è¨ãããã§ã«ã©ã åã¾ã§æ±ºå®ã
ããããããããã«ããªãã¼ã·ã§ã³ããããã®ã¯ä½ã«ããããã¨è©±ãåãã
- ååã¨ã¡ã¢ãã¯å¿ é ã ããã¼ã
- æ§å¥ã¯ç·ã女ãã§ã
- å¹´é½¢ï¼ï¼ä»¥ä¸ã¨ãå¶éä»ãã¦ãããï¼
- é ã¨ããããã18ããæªããããã£ã±20以ä¸ã§
- èªå·±ç´¹ä»ï¼ï¼ï¼æå以ä¸ã§ã
- ã¡ã¢ãã¯ã¡ããã¨ããã¡ã¢ããããªãã¨éããªãæ§ã«ã*2
- ã¡ã¢ãã¯ãµã¼ããåå¨ãããã®ãã§ãã¯ããããããã¼ã
ã¨è¨ãããã§åå è å ¨å¡ã§éçºéå§ã
ã¨ããããããããã¸ã§ã¯ãåæãæµ®ãã°ãªãã£ãã®ã§member_listã¨ãã§ããã¸ã§ã¯ã使
$ rails member_list
ããã¡ã¤ã«ãã£ã±ã使ã
$ cd member_list
ã§ãruby script/generateã§ã¢ãã«ä½æã
$ ruby script/generate Model Member name:string age:integer drink:boolean \
sex:string discription:text mail:string
ã§ãrake migrateãããã¨ããæã«ããããã°DBä½ã£ã¦ãªãã£ãããã¼ã£ã¦äºã§DB使
$ mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 54 Server version: 5.0.38-Ubuntu_0ubuntu1-log Ubuntu 7.04 distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> create database member_list_development character set utf8;
ã¨ãããã§ä½äººãã®äººã®ç«¯æ«ä¸ã¯mysqlãããªãã¦sqliteã ã£ãããã§ã
sqliteç¨ã«config/database.ymlãå¤ãã¦ãããã
ã§ããã¤ãã®ããã«rake migrate*3
$ rake migrate
ã»ãã¨ã¯é§ç®ãªæ¸ãæ¹ã§ãã¡ããã¨rake db:migrateã£ã¦ãã£ã¦ãã ããã
ã¨ããããããã§ã¡ã³ãã¼ãã¼ãã«ãã§ãããã£ãã¯ããªã®ã§scaffold使ã
$ ruby script/generate scaffold Member
ããã§ããã¤ãã®æ§ã«ruby script/serverããã£ã¦ã
http://localhost:3000/membersã«ã¢ã¯ã»ã¹ããã¨scaffoldãã§ãããã£ã¦ãã¯ãã
ã¾ã ããªãã¼ã·ã§ã³çµã¿è¾¼ãã§ãªãã®ã§ãæ®éã«æ¸ãè¾¼ãã¾ãã
æåã®ããªãã¼ã·ã§ã³
ã¨ããããååã®å¿ é åãè¡ããã¨ã«ã
validates_presence_of ã使ã£ã¦ãMemberã¯ã©ã¹ã®nameãå¿
é ã«ãã¦ã¿ã¾ãããã
class Member < ActiveRecord::Base validates_presence_of :name end
ããã¦ãhttp://localhost:3000/members/newããååã空ã§ä½ã£ã¦ã¿ãã¨
[Name can't be blank]ã¨è¦åãåºã¦ä½æåºæ¥ãªãããã«ãªãã¾ãã
ã§ãããã£ãããªã®ã§è¦åæãå¤ãã¦ããã¾ããããã£ã¦äºã§:messageãæå®ãã¦ã¿ãã
class Member < ActiveRecord::Base validates_presence_of :name, :message => 'ã¯ç©ºç½ã§ã¯ãããªãã®ã§ãã' end
ããã§ãName ã¯ç©ºç½ã§ã¯ãããªãã®ã§ãããã¨è¦åãã§ã¾ããã
ã§ãmailã空ç½é§ç®ã§ãããããã£ã¦äºã§ã¡ã¼ã«ã追å ã
class Member < ActiveRecord::Base validates_presence_of :name, :mail, :message => 'ã¯ç©ºç½ã§ã¯ãããªãã®ã§ãã' end
ã£ã¦æ¸ãã¨ãªãã¨mailãnameãè¦åãåºãã¦ããã¾ãã
- Name ã¯ç©ºç½ã§ã¯ãããªãã®ã§ãã
- Mail ã¯ç©ºç½ã§ã¯ãããªãã®ã§ãã
ãããªé¢¨ã«äºè¡ã
楽ã§ãããã¼ã
ã£ã¦èª¬æãã¦ãã¨åå¼·ä¼ã®æéãç¡ããªã£ã¦ããã®ã§ã
ä¸çªæ±ç¨æ§ã®ããvalidationã説æã
def validate ã£ã¦æ¸ãã¨è²ã
ã§ãã¾ããã¼ãã¨
class Member < ActiveRecord::Base validates_presence_of :name, :mail, :message => 'ã¯ç©ºç½ã§ã¯ãããªãã®ã§ãã' def validate if self.age && self.age < 20 self.errors.add :age,'ã20æä»¥ä¸ã®å ¥ä¼ã¯èªãã¾ãã' return false end end end
ãããªæãã
ã§ãæéãç¡ããªã£ã¦ããã®ã§ãvalidationã®è§£èª¬ã¯å¥ã«ãã¦ã
ã©ãã§ã¨ã©ã¼ã¡ãã»ã¼ã¸ã表示ãã¦ãã®ã¼ï¼ã£ã¦è©±ãããã¦ãããã¾ããã
DRYãªæã
ã¨ã©ã¼ã¡ãã»ã¼ã¸ã®åã«ãapp/views/member/new.rhtmlã¨edit.rhtmlãéãã¦è§£èª¬ã
new.rhtml
<h1>New member</h1> <% form_tag :action => 'create' do %> <%= render :partial => 'form' %> <%= submit_tag "Create" %> <% end %> <%= link_to 'Back', :action => 'list' %>
edit.rhtml
<h1>Editing member</h1> <% form_tag :action => 'update', :id => @member do %> <%= render :partial => 'form' %> <%= submit_tag 'Edit' %> <% end %> <%= link_to 'Show', :action => 'show', :id => @member %> | <%= link_to 'Back', :action => 'list' %>
æ°è¦ä½æç»é¢ããç·¨éç»é¢ãå
±éã®å
¥åãã©ã¼ã ã¯ã<%= render :partial => 'form' %>ã§
_form.rhtmlãå¼ã³åºãã¦ãäºããããã¾ãã
ã¨ããããã§ãå®éã®é
ç®ã®ç»é¢ãªããã¯å
±éã®é¨åã¤ãã£ã¦ã¦ã夿´æã¯ããã ããå¤ããã°
æ¸ãããã«ãªã£ã¦ã¾ãã
Railsã®ããããæ¸ãæ¹ã¯DRYçã§ããªã好ãã§ãã
ã§ãå®éã®_form.rhtmlãéãã¦ã¿ã¾ãã
<%= error_messages_for 'member' %> <!--[form:member]--> <p><label for="member_name">Name</label><br/> <%= text_field 'member', 'name' %></p> <p><label for="member_age">Age</label><br/> <%= text_field 'member', 'age' %></p> <p><label for="member_drink">Drink</label><br/> <select id="member_drink" name="member[drink]"><option value="false">False</option><option value="true">True</option></select></p> <p><label for="member_sex">Sex</label><br/> <%= text_field 'member', 'sex' %></p> <p><label for="member_discription">Discription</label><br/> <%= text_area 'member', 'discription' %></p> <p><label for="member_mail">Mail</label><br/> <%= text_field 'member', 'mail' %></p> <!--[eoform:member]-->
ã§ãããã®error_messages_forã§ã¨ã©ã¼ã¡ãã»ã¼ã¸ãããã¨ãã ã表示ããã¦ã¾ããã¼ã£ã¦è©±ããã¾ããã
controllerã®ã¯ãªã¨ã¤ãã®é¨åããããã¦è§£èª¬ã
member_controller.rbã®createã¡ã½ããã ããæãåºãã¨ãããªæã
1 def create 2 @member = Member.new(params[:member]) 3 if @member.save 4 flash[:notice] = 'Member was successfully created.' 5 redirect_to :action => 'list' 6 else 7 render :action => 'new' 8 end 9 end
2è¡ç®ã§ãparams[:member]ã«å
¥ã£ã¦ããã¼ã¿ãå
ã«ã@memberã«ãã¼ã¿ã使ãã
3è¡ç®ã§ä¿åã«ãã£ã¦ã¾ãã
ã§ãä»åå
¥ããããªãã¼ã·ã§ã³ãªã©ã®çç±ã«ãã£ã¦ãã¼ã¿ã®ä¿åã«å¤±æããã¨ã
6è¡ç®ã®elseã«ãã£ã¦ãnewã®å
容ã表示ããrender :action => 'new'ã¨å®è¡ããã¦ãã¾ãã
ãã®å¾ã@memberãä¿åããéã«çºçããã¨ã©ã¼ãviewå´ã®error_messages_forã§è¡¨ç¤ºãã¦ãã¾ãã
ã§ãããã§ãåå ãã¦ã人ããjavaã ã¨ããããä¾å¤å¦çãå®è£
ããã®ã«æéãããããã©ã
railsã¯ãããããã¦ãã¦ã誰ã§ã使ããããããããã¼ã£ã¦è©±ãããã¦ã¾ããã
ããããè³æã§ãã
ã¨è¨ãæãã§ä»åã®åå¼·ä¼çµäºãã¾ããã
*1:ãã以å¤ã®æ§å¥ã¯ï¼ã£ã¦è©±ãåºã¦ã¾ããw
*2:ã¡ã¢ãã®æ£è¦è¡¨ç¾ãæ¬æ°ã§é å¼µãã¨ããã ãã§å¤§å¤ã«ãªãã®ã§ãç¨ã ã§