å¨ Ruby on Rails ä¸ä½¿ç¨ Ajax
è´¡ç®è
ï¼Brian Leonardï¼ç»´æ¤è
ï¼Gail Chappell
2007 å¹´ 12 æ [修订å?·ï¼V6.0-4]
卿¬æç¨ä¸ï¼æä»¬å°ä»ç»?å¨ NetBeans Ruby on Rails 项ç®ä¸æ·»å Ajax æ¯æ?ãæç¨ç¤ºä¾å±ç¤ºäºå¦ä½å¨ web æ¥å¿ä¸å¨æ?å°æ·»å è¯è®ºã
ç®å½
|
|
 |
æç¨éæ±
å¦ä¹ æ¬æç¨éè¦?以䏿æ¯åèµæº?ï¼
åå»ºæ ·ä¾æ°æ?®åº
注æ?ï¼æ¬æç¨ä½¿ç¨ MySQL æ°æ?®åºæ?å¡å¨ãæ¨å?¯ä»¥å?è
å®è£
åé
?ç½® Ruby æ¯æ?䏿以è·å?æå
³å¦ä½å¨ Ruby åºç¨ç¨åº?ä¸ä½¿ç¨ MySQL æ°æ?®åºæ?å¡å¨çä¿¡æ?¯ãè¯¥ææ¡£å?æ ·ä»ç»?äºå¦ä½ä½¿ç¨ JavaDB æ°æ?®åºæ?å¡å¨ä½ä¸ºæ¿ä»£ã
- æå¼ä¸ä¸ªå½ä»¤è¡çªå?£ã
- 妿 MySQL æ°æ?®åºæ?å¡å¨å°æªè¢«å?¯å¨ï¼è¯·å
å°å
¶å?¯å¨ã
- é®å
¥å¦ä¸å½ä»¤æ?¥å建å¼å?æ°æ?®åºï¼å¹¶æâEnterâ?é®ã
mysqladmin -u root -p create rubyweblog_development
注æ?ï¼å¦æ root ç¨æ·ä¸?è¦?æ±å¯ç ?ï¼è¯·ç?ç¥ -p å?æ°ã
å¨ IDE ä¸æå¼ rubyweblog 项ç®ã
注æ?ï¼å¦ææ¯å?次æå¼æè
å建 Ruby 项ç®ï¼IDE 伿£æ¥æ¨æ¯å?¦æé¤äºç»å®ç JRuby 软件ä¹å¤å
¶ä»ç Ruby å®è£
ã妿æï¼IDE 伿¾ç¤ºä¸ä¸ªå¯¹è¯?æ¡ï¼è¯¢é®æ¨éæ©ä½¿ç¨åªä¸ªè½¯ä»¶ãè¥æ¨æ³è¦?使ç¨ç»å®ç JRuby è§£éå¨ï¼éæ© JRubyï¼æè
æ¨åæ¬¢ä½¿ç¨æ¨èªå·±ç Ruby å®è£
ï¼é£å°±éæ©æ¨èªå·±çå®è£
ãæ´å¤ä¿¡æ?¯ï¼è¯·å?èãå®è£
åé
?ç½® Rubyãæç¨ä¸çé
?ç½® IDE ä½¿ç¨æ¨èªå·±ç Ruby å®è£
ä¸èã
妿æ¨çæ°æ?®åºè¦?æ±å¯ç ?ï¼è¯·ç¼ç¼ database.yml æä»¶ï¼å¹¶å¨å¼å?é
?ç½®é¨å䏿??ä¾å¯ç ?ãä¿?å该æä»¶ã
è¦?å¿«éè®¿é® database.yml æä»¶ï¼æ Alt+Shift+Oï¼å¨ Mac ç³»ç»ä¸æ Ctrl+Shift+Oï¼ï¼å¨âæä»¶å??â?ææ¬æ¡ä¸é®å
¥ database.ymlï¼ç¶å?æâEnterâ?é®ã
-
å?³é®ç¹å» rubyweblog èç¹ï¼éæ©âè¿?ç§»æ°æ?®åºâ?>âå°å½å?çæ¬â?ã
该æ?ä½ä¼æ´æ°æ°æ?®åºä»¥å å
¥ posts 表å comments 表ã è¿?ç§»å®æ?æ¶ä¼å¨âè¾åºâ?çªå?£æ¾ç¤ºã
-
è¿?è¡åºç¨ç¨åº?å¹¶å?表ä¸ç¯æ°æç« ã
ç¹å»âPermalinkâ?ï¼ç¶å?ç»è¯¥æç« æ·»å 䏿?¡è¯è®ºã
å?¯ä»¥å?ç°å½æ·»å è¯è®ºæ¶ï¼æ´ä¸ªé¡µé?¢é½è¢«é?æ°å è½½äºã
å建å±é¨æ¨¡æ?¿
å¨å½å?ç rubyweblog 项ç®ä¸ï¼æ è®ºä½æ¶è¯»è
å?页é?¢æ·»å è¯è®ºï¼é¡µé?¢ä¸ç blog æ?¡ç®åææè¯è®ºé½ä¼è¢«é?æ°è½½å
¥ãæ´å¥½çè§£å³æ¹æ¡æ¯ä½¿ç¨ Ruby on Rails æ¡æ¶ä¸ç Ajax æ¯æ?æ?¥å¨æ?å è½½è¿äºè¯è®ºãä½ä¸ºä½¿ç¨ Ajax çé¢å
åå¤ï¼éè¦?å建å±é¨æ¨¡æ?¿æ?¥åå¨ç¨äºæ¾ç¤ºè¯è®ºç代ç ?ã使ç¨å±é¨æ¨¡æ?¿ç好夿¯å?¯ä»¥å¤æ¬¡è°ç¨å±é¨æ¨¡æ?¿ï¼æ¾ç¤º blog 䏿¯?个è¯è®ºéè¦?䏿¬¡ï¼ï¼ èæ éæ¸²æ blog æ?¡ç®æ¬èº«ã
-
å?³é®ç¹å» rubyweblog èç¹ï¼éæ©âæ°å»ºâ?>âRHTML Fileâ?ãå°æä»¶å½å??为 _commentsï¼å¹¶å°å
¶æ¾ç½®å¨ app\views\blog æä»¶å¤¹ä¸ã
IDE ä¼å建 _comments æä»¶ï¼å¹¶å°å
¶å¨ç¼è¾åºæå¼ã 注æ?ï¼å±é¨æ¨¡æ?¿çæä»¶å??使ç¨ä¸å线ï¼_ï¼å¼å¤´ï¼ä»¥åºå«äºå®å
¨æ¨¡æ?¿ã
å½å?ï¼æ¾ç¤ºè¯è®ºç代ç ?卿件 show.rhtml ä¸ãèå¨ä¸ä¸æ¥ï¼åä¼ä» show.rhtml ä¸å é¤è¿é¨å代ç ?ï¼å¹¶å°ä»£ç ?ç²è´´è³å±é¨æ¨¡æ?¿ _comments.rhtml ä¸ã
-
è½¬è³ rubyweblog >âViewsâ?> blog æä»¶å¤¹ ï¼å¹¶æå¼ show.rhtmlãåªåç¨äºæ¾ç¤ºè¯è®ºç代ç ?ï¼å¦ä»£ç ?ç¤ºä¾ 1 ä¸æç¤ºï¼ãå°ä»£ç ?ç²è´´è³ _comments.rhtml æä»¶ï¼æ¿æ?¢å
¶ä¸ææå·²æå
容ã
代ç ?ç¤ºä¾ 1ï¼ä» show.rhtml ä¸åªåï¼å¹¶ç²è´´è³ _comments.rhtml ä¸ç代ç ? |
<ul>
<% @post_comments.each do |comment| %>
<li><%= h comment.comment %><br>
<div style="color: #999; font-size: 8pt">
Posted on <%= comment.created_at.strftime("%B %d, %Y at %I:%M %p") %>
</div>
</li>
<% end %>
</ul>
|
-
è¿å show.rhtml æä»¶ï¼æ?å
¥ä¸é?¢ç HTML <div> æ ç¾ãå°å
¶æ·»å å¨ <h4>Comments</h4>ä¹å?ï¼ä¹å?被å é¤ç代ç ?çä½?ç½®ã
代ç ?ç¤ºä¾ 2ï¼ç¨äº show.rhtml ç <div> æ ç¾ |
<div id="comments">
<%= render(:partial => 'comments', :object => @post_comments) %>
</div>
|
æ¤æ®µä»£ç ?ä¼å建ä¸ä¸ªå??为 comments ç <div> å
ç´ ã@post_comments å?é?å
å?«äºå±é¨æ¨¡æ?¿ _comments æ¾ç¤ºçè¯è®ºã
-
éæ©âæä»¶â?>âå
¨é¨ä¿?åâ?ï¼ç¶å?è¿?è¡åºç¨ç¨åº?ã
-
ç¹å»âPermalinkâ?ï¼ç¶å?ç»æç« æ·»å 䏿?¡è¯è®ºã
æ¤æ¶ï¼åºç¨ç¨åº?ç表ç°åå?é?¢å¦åºä¸è¾ãä½å®ç°å¨å·²è¢«è®¾è®¡æ?å?¯ä»¥å¼å§ä½¿ç¨ Ajax æ¯æ?äºã
æ·»å Ajax æ¯æ?
å¨é¡¹ç®ä¸æ·»å Ajax æ¯æ?çç¬¬ä¸æ¥æ¯å å
¥ JavaScript åºï¼Prototype å script.aculo.usãè¿äºåºæ¯ä¸ Ruby on Rails ç»å®å¨ä¸èµ·çãPrototype åºæ??ä¾äº Ruby on Rails ä¸ Ajax å®ç°çåºç¡ï¼èscript.aculo.us åºåæ??ä¾äºè§è§ç¹æï¼å?¯å¨åºç¨ç¨åº?ä¸é?æ?æ·»å ã
-
å±å¼âViewsâ?>âlayoutsâ?ï¼ç¶å?æå¼
blog.rhtml æä»¶ã
-
å¨å
å?« stylesheet_link_tag çè¡ä¸é?¢ï¼æ·»å å¦ä¸ä»£ç ?è¡ï¼
<%= javascript_include_tag :defaults %>
æ¤è¡ä»£ç ?ä¼å å
¥ä¸ Ruby on Rails ç»å®ç JavaScript åºï¼Prototype å script.aculo.usãä¸ä¸æ¥æ¯å建 form_remote_tagï¼ä»¥è§¦å? Ajax å¨ä½ã
-
æå¼
show.rhtml æä»¶ãå é¤å·²æç form_tagï¼æ§è¡ HTTP POSTï¼ï¼å¹¶å°å
¶æ¿æ?¢æ?ä¸é?¢ç form_remote_tagï¼æ§è¡ XMLHTTPRequestï¼ã
<% form_remote_tag :url => {:action => "post_comment"} do %>
æ¤è¡ä»£ç ?ä¼è§¦å?ç¨äº blog_controller.rb æä»¶ä¸ post_comment æ?ä½ç Ajax å¨ä½ãèæ¤æ¶ï¼æ´ä¸ªé¡µé?¢ä»?ç¶ä¼å¨è¯»è
æ??交è¯è®ºæ¶é?æ°å è½½ãè¿æ¯å 为post_comment å¨ä½ä¼éè¿è°ç¨ show å¨ä½å¼ºå¶é?æ°å è½½ãæå?䏿¥å?³æ¯ç¼ç¼ blog_controller.rb æä»¶ï¼å é¤è¯¥è°ç¨ã
-
å±å¼âControllersâ?èç¹ï¼æå¼
blog_controller.rb æä»¶ã
- æ»å¨è³
post_comment å¨ä½ï¼æ³¨éæ redirect_to è°ç¨ã
# redirect_to :action => 'show', :id => flash[:post_id]
妿æ¨ç°å¨å°±è¿?è¡åºç¨ç¨åº?ï¼å¹¶æ·»å 䏿?¡è¯è®ºï¼å该è¯è®ºä¸?ä¼è¢«æ¾ç¤ºåºæ?¥ãæ¨å¿
é¡»å¨ä¸ä¸æ¥æ?å
¥ Ruby JavaScript ï¼RJSï¼æ¨¡æ?¿æ?¥å¤ç? XMLHTTPRequestã
æ·»å RJS å®ç°å¨æ?æ´æ°
æå?çæ¥éª¤æ¯ä½¿ç¨å
建ç RJS æ¯æ?æ?¥å¨æ?æ´æ° blog ä¸çè¯è®ºã
-
å¨âViewsâ?èç¹ä¸ï¼å?³é®ç¹å»âblogâ?èç¹ï¼éæ©âæ°å»ºâ?->âEmpty RJS Templateâ?ã
-
设置âæä»¶å??â?为
post_commentï¼å¹¶å°å
¶ä»¿çå¨ app\views\blog æä»¶å¤¹ä¸ã
-
å é¤å·²æç页é?¢å¯¹è±¡ï¼ç¶å?å¨è¯¥ä½?ç½®æ?å
¥ä¸é?¢ç页é?¢å¯¹è±¡ã
page.replace_html 'comments', :partial => 'comments', :object => @post_comments
page[:comment_comment].clear
åå¿ä¸ä¸ï¼show.rhtml æä»¶å
å?«ä¸ä¸ªå??为 comments ç HTML div æ ç¾ï¼å?è§?代ç ?ç¤ºä¾ 2ï¼ã卿¤æ®µä»£ç ?ç第ä¸è¡ä¸ï¼replace_html ä½¿ç¨ DHTML 卿?å°å° show.rhtml æä»¶ä¸è¯¥ div æ ç¾å
çè¿ä¸é¨å HTML 代ç ?æ¿æ?¢ä¸ºå±é¨æ¨¡æ?¿ _comments.rhtml ä¸ç HTML 代ç ?ãè@post_comment å?é?åå?«æå±é¨æ¨¡æ?¿ _comments æ¾ç¤ºçè¯è®ºãæ¤æ®µä»£ç ?ç第äºè¡ä¼å¨ç¨æ·æ??交è¯è®ºå?æ¸
ç©ºææ¬æ¡ã
ä¸?è¿æ¨ç°å¨è¿?è¡è¯¥åºç¨ç¨åº?ï¼è¯è®ºä¾?ç¶ä¸?伿¾ç¤ºï¼å 为å?é? @post_comment æ¯ç©ºçã妿æ¨å头çç blog_controller.rb æä»¶ï¼æ¨ä¼å?ç° @post_comment æ¯å¨ show å¨ä½ä¸è®¾ç½®çï¼èå®ä¸?å?被è°ç¨äºãå æ¤ç°å¨å¿
é¡»ç¼ç¼ blog_controller.rb æä»¶ã
-
æå¼ blog_controller.rb æä»¶ï¼æ¾å° post_comment å¨ä½ï¼å¨æ©å
注éæçé?å®å?è¯å?¥å?é?¢æ·»å å¦ä¸ä¸è¡ä»£ç ?ï¼
代ç ?ç¤ºä¾ 3ï¼ç¨äº blog_controller.rb æä»¶çæ´æ° |
#redirect_to :action => 'show', :id => flash[:post_id]
@post = Post.find(flash[:post_id])
@post_comments = @post.comments.collect
flash[:post_id] = @post.id #Store the post.id back in the flash
|
æ¤æ®µä»£ç ?ç第ä¸è¡ä¼è°ç¨ flashï¼ç±»ä¼¼ HTTP ä¼è¯?ï¼ä½å?¯ä»¥è·¨è¶å?个请æ±ï¼ãå½å¨ flash 䏿¾å
¥ä¸ä¸ªç©å?æ¶ï¼è¯¥ç©å?对ä¸ä¸ªè¯·æ±å?¯ç¨ï¼ä½ç¶å?å°±æ¶å¤±äºï¼å æ¤ä½¿ç¨æ¯è¯âflashâ?ç§°ä¹ï¼ãæ¤æ®µä»£ç ?ä» flash ä¸è·å? post_idï¼1, 2, ...ï¼ï¼å¹¶ä½¿ç¨è¯¥ id æ¥æ¾ä¸ä¹ç¸å
³è?ç blog æç« ã
æ¤æ®µä»£ç ?ç第äºè¡ä¼æè¯¥æç« çæ´ä¸ªè¯è®ºéå?æ¾å°å?é? @post_comment ä¸ï¼è¯¥å?é?ä¼å¨ä¹å?è¢«ä¼ éè³å±é¨æ¨¡æ?¿ _comments ä¸ã
æ¤æ®µä»£ç ?çæå?ä¸è¡æ post_id æ¾å flash ä¸ï¼è¿æ ·å?¯ä»¥ä¸ºç¨æ·æ??交çä¸ä¸æ?¡è¯è®ºå?好åå¤ã
-
è¿?è¡é¡¹ç®ï¼éªè¯?ä¸ä¸è¯è®ºè½è¢«å¨æ?æ´æ°äºã
æ´ä¸ä¸å±æ¥¼ï¼åºç¨è§è§ç¹æ
ä¹å?å¨é¡¹ç®ä¸å å
¥ç script.aculo.us åºæ??ä¾äºè§è§ç¹æï¼å?¯ä»¥ä½¿ç¨è¿äºç¹ææ?¥æ¹ååºç¨ç¨åº?çå¤è§åç¨æ·ä½éªã卿¤ï¼æä»¬å°åºç¨ä¸ä¸ªç¹ææ?¥é«äº® blog ä¸çææ°è¯è®ºãå¨åºç¨è¯¥ç¹æä¹å?ï¼æ¨å°±å?¯ä»¥æ¹ä¾¿çæ¿æ?¢å¹¶å°?è¯ script.aculo.us åºä¸çå
¶ä»ç¹æäºã
-
æå¼æä»¶ _comments.rhtmlï¼å°è¡ <li> <%= comment.comment %><br> æ¿æ?¢æ?ä¸é?¢ç代ç ?å?ï¼
| 代ç ?ç¤ºä¾ 4ï¼å¤å®ææ°è¯è®ºç代ç ? |
<% if @post_comments.index(comment) == @post_comments.length-1 %>
<li id="new_comment"><%=h comment.comment %><br>
<% else%>
<li><%=h comment.comment %><br>
<% end %>
|
æ¤æ®µä»£ç ?ç第ä¸è¡å¤æä¸ä¸ªè¯è®ºæ¯å?¦æ¯ææ°çãè¥æ¯ï¼åå¨ä»£ç ?ç第äºè¡ç»è¯¥è¯è®ºåé
? id new_commentï¼å 为该è¯è®ºæ¯æä»¬æ³è¦?åºç¨è§è§ç¹æçã
-
åæ?¢è³ post_comment.rhtml æä»¶ï¼å¹¶æ·»å ä¸é?¢è¿è¡é«äº®æ°è¯è®ºç代ç ?ï¼
page[:new_comment].visual_effect :highlight
-
éæ©âæä»¶â?>âå
¨é¨ä¿?åâ?ï¼ç¶å?å·æ°æµ?è§å¨ãæ·»å 䏿?¡è¯è®ºï¼å?æ¶çæ?该æ°è¯è®ºæ¯è¢«å¦ä½ç®æå°é«äº®çã
å¾ 1ï¼å¸¦æé«äº®æ¾ç¤ºçè¯è®ºæ¨¡åè§å¾
æ´å¤å
容
>> æ´å¤ NetBeans Ruby ææ¡£