æå»º Rails 模åä¹é´çå
³ç³»
è´¡ç®è
ï¼Brian Leonardï¼ç»´æ¤è
ï¼Gail Chappell
2007 å¹´ 12 æ [修订å?·ï¼V6.0-3]
æ¬æç¨ä»ç»?å¦ä½å¨ NetBeans Ruby on Rails 项ç®ä¸æå»ºæ¨¡åä¹é´çå
³ç³»ï¼ä¸å¯¹ä¸åå¤å¯¹ä¸ï¼ã
ç®å½
|
|
 |
æç¨éæ±
å¦ä¹ æ¬æç¨éè¦?以䏿æ¯åèµæº?ï¼
åå»ºæ ·ä¾æ°æ?®åº
æ¬æç¨åºäºæç¨
10 åéå建 Ruby Weblogã妿æ¨å®æ?äºé£ç¯æç¨ï¼é£ä¹æ¨å?¯ä»¥å°å®æ?æç¨æ¶çæ?ç项ç®ä½ä¸ºèµ·ç¹ï¼ç´æ¥è¿å
¥
ä¸ä¸èãå?¦åï¼è¯·æ¨å
ä¸è½½
RubyWebLog.zip æä»¶ï¼ç¶å?æç
§ä¸é?¢çæ¥éª¤åå»ºæ ·ä¾æ°æ?®åºã
注æ?ï¼æ¬æç¨ä½¿ç¨ 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 表并添å body åæ®µã è¿?ç§»å®æ?æ¶ä¼å¨âè¾åºâ?çªå?£æ¾ç¤ºã
-
è¿?è¡åºç¨ç¨åº?å¹¶å?表ä¸ç¯æ°æç« ã
å建è¯è®ºæ¨¡å
æ¬æç¨éè¿å¢å å
?许读è
ç» blog æç« æ·»å è¯è®ºçåè½æ©å
rubyweblog 项ç®ãé¦å
è¦?å建è¯è®ºæ¨¡åæ?¥åå¨è¯»è
è¯è®ºå®ä¾ãèæ¤é¡¹ç®ä¸å·²ç»?æäºåå¨ blog æç« å®ä¾çæç« 模åã
-
å¨â项ç®â?çªå?£ä¸ï¼å±å¼ârubyweblogâ?èç¹ï¼å?³é®ç¹å»âModelsâ?èç¹ï¼ç¶å?éæ©âGenerateâ?ã
å¨âArgumentsâ?åæ®µä¸é®å
¥ Comment post_id:integer created_at:datetime comment:textï¼ç¶å?ç¹å»âOKâ?ã
âRails Generatorâ?ä¼å建ä¸ä¸ªå??为âCommentâ?çæ¨¡åã该模åå
å?«å¦ä¸æä»¶ï¼
- app/models/comment.rb åæè¯è®ºæ¨¡åæ¹æ³çæä»¶ãæ¤æä»¶å·²å¨ç¼è¾åºä¸æå¼ã
- test/unit/comment_test.rb ç¨äºæ£æµæ¨¡åçå?å
æµè¯ã
- test/fixtures/comments.yml ç¨äºå¡«å
模åçæµè¯å¥ä»¶
-
db/migrate/migrate/003_create_comments.rb æ´æ¹æ°æ?®åºç»æçè¿?ç§»æä»¶ã
该æä»¶ççæ¬ä¸º003ï¼è¿æ¯å 为项ç®å·²ç»?æäºä¸¤ä¸ªè¿?ç§»æä»¶ï¼
001_create_posts.rb å 002_add_body.rbï¼ä»ä»¬ç¨äºå建åä¿®æ¹ posts 表ã
è¿?ç§»æ°æ?®åº
æ¥ä¸æ?¥è¦?å¤ç?çæä»¶å°±æ¯è¿?ç§»æä»¶ 003_create_comments.rb äºã
å¨âè¾åºâ?çªå?£ä¸ï¼ç¹å» 003_create_comments.rb æä»¶ç龿¥ã
æä»¶æå¼å?伿¾ç¤º self.up æ¹æ³ï¼å建 comments 表ï¼å self.down æ¹æ³ï¼å é¤ comments 表ï¼ï¼å¦ä¸å代ç ?ç¤ºä¾æç¤ºï¼
| 代ç ?ç¤ºä¾ 1ï¼comments 表çè¿?移代ç ? |
class CreateComments < ActiveRecord::Migration
def self.up
create_table :comments do |t|
t.column :post_id, :integer
t.column :created_at, :datetime
t.column :comment, :text
end
end
def self.down
drop_table :comments
end
end |
æ¤æ®µè¿?移代ç ?ä¼å建ä¸å¼ å?«æ 4 ä¸ªåæ®µ comments 表ï¼idï¼æ´æ°ï¼post_idï¼æ´æ°ï¼created_atï¼å卿¥ææ¶é´ï¼commentï¼ææ¬æ??è¿°ã
å?³é®ç¹å» rubyweblog èç¹ï¼éæ©âè¿?ç§»æ°æ?®åºâ?>âå°å½å?çæ¬â?ã
该æ?ä½ä¼æ´æ°æ°æ?®åºä»¥å å
¥ comments 表ã è¿?ç§»å®æ?æ¶ä¼å¨âè¾åºâ?çªå?£æ¾ç¤ºã
å®ä¹è¯è®ºæ¨¡ååæç« 模åä¹é´çå
³ç³»
åºç¨ç¨åº?ç®å?æä¸¤ä¸ªæ¨¡åï¼æç« æ¨¡åå?表ä¸ç¯æ°ç blog æç« ï¼èè¯è®ºæ¨¡ååå?ä¸ç¯ blog æç« æ·»å 䏿?¡è¯è®ºãç°å¨ç»ä¸¤ä¸ªæ¨¡åä¹é´å®ä¹å
³ç³»ï¼ 使å¾ä¸æ?¡è¯è®ºå
³è?ä¸ç¯æç« ï¼èä¸ç¯æç« å?¯ä»¥å
å?«å¤æ?¡è¯è®ºã
- å±å¼âModelsâ?èç¹ï¼æå¼
post.rbã
-
å¨ post.rb 䏿·»å å¦ä¸ has_many å
³è?ï¼
代ç ?ç¤ºä¾ 2ï¼post.rb ä¸ç has_many å
³è? |
class Post < ActiveRecord::Base
validates_presence_of :title, :body
has_many :comments
end
|
has_many æ¹æ³è¡¨ææç« å?¯ä»¥æ 0 个ã?1 个æè
å¤ä¸ªè¯è®ºè®°å½ä¸ä¹å
³è?ã
å°?è´´å£«ï¼ é®å
¥è§¦å?å¨ hmå?æ Tab é®ï¼å?¯ä»¥æ©å±æ?代ç ?模æ?¿ has_many :objectsã
-
æå¼âModelsâ?> comment.rbï¼ç¶å?æ·»å belongs_to å
³è?ï¼
代ç ?ç¤ºä¾ 3ï¼comment.rb ä¸ç belongs_to å
³è? |
class Comment < ActiveRecord::Base
belongs_to :post
end
|
belongs_to æ¹æ³è¡¨æä¸æ?¡è¯è®ºå?ªè½åä¸ç¯æç« ç¸å
³è?ãActiveRecord é»è®¤ä½¿ç¨ post_id æ?¥å°ä¸æ?¡è¯è®ºåæç¸åº post.id çæç« è¿è¡å
³è?ã
å°?贴士ï¼bt 触å?å¨è½æ©å±æ? belongs_to :objectã
ä¿®æ¹æ§å¶å¨èææ¶
æ¥ä¸æ?¥å¤ç?æ§å¶å¨ï¼blog_controller.rbï¼å®è½çæ?ç¨äºå¨ blog æç« ä¸å建ã?读å?ã?æ´æ°åå 餿?¡ç®çèææ¶æè
åºæ¬æ¥å?£ã
-
å±å¼âControllersâ?èç¹ï¼æå¼ blog_controller.rbã
æ§å¶å¨æ¥æææçèææ¶å¨ä½ï¼å
æ¬ indexã?listã?showã?newã?createã?editã?update å destroyã
-
å¦ä¸é?¢ç代ç ?ç¤ºä¾æç¤ºï¼ä¿®æ¹ show å¨ä½ï¼å° post_id ä¿?åå° flash ä¸ï¼
代ç ?ç¤ºä¾ 4ï¼show å¨ä½ |
def show
@post = Post.find(params[:id])
flash[:post_id] = @post.id
end
|
æ¤æ®µä»£ç ?æ¥æ¾ä¸è¯·æ±ä¸æä¼ çå?æ° id ç¸å
³è?çæç« ãç¶å?æ id åæ¾å° flash ä¸ä»¥å¤å?ç¨ãflash ç±»ä¼¼äº HTTP ä¼è¯?ï¼ä½å?¯ä»¥è·¨è¶å?个请æ±ãå½å¨ flash 䏿¾å
¥ä¸ä¸ªç©å?æ¶ï¼è¯¥ç©å?对ä¸ä¸ªè¯·æ±å?¯ç¨ï¼ä½ç¶å?å°±æ¶å¤±äºï¼å æ¤ä½¿ç¨æ¯è¯âflashâ?ç§°ä¹ï¼ã
-
æ»å¨è³ blog_controller.rb æä»¶çç»å°¾å¤ï¼ç¶å?卿å?ç end è¯å?¥å?æ·»å å¦ä¸ post_comment å¨ä½ï¼
代ç ?ç¤ºä¾ 5ï¼post_comment å¨ä½ |
def post_comment
@comment = Comment.new(
"post_id" => flash[:post_id],
"created_at" => Time.now,
"comment" => params[:comment]['comment']
)
if @comment.save
flash[:notice] = 'Comment was successfully added.'
redirect_to :action => 'show', :id => flash[:post_id]
end
end
|
å½ç¨æ·ç¹å»âPostâ?æé®æ??交è¯è®ºæ¶å°±ä¼è°ç¨ post_comment å¨ä½ãæ¤æ®µä»£ç ?çç¬¬ä¸æ®µä» flash ä¸è·å? post_idï¼1, 2, ...ï¼ï¼å¹¶ä½¿ç¨è¯¥ id æ¥æ¾ä¸ä¹ç¸å
³è?ç blog æç« ãç´§æ¥ç?代ç ?ä¼å建ä¸ä¸ªæ°çè¯è®ºå¯¹è±¡æ?¥å
³è?该 post_idï¼ç»æ?é¨åè¿å
æ¬å建æ¶é´åå®é
è¯è®ºãRails æ¡æ¶æä»é¡µé?¢æ??交çå?æ°ä½ä¸ºæ£åæ?¥ä¼ éï¼params[:comment]ï¼ï¼éè¿è¯¥æ£åç ?è½å¤å?åºè¯è®ºå?æ°ï¼params[:comment]['comment']ï¼ã
ç±äºè¯è®ºï¼Commentï¼æ¯ä¸ä¸ª ActiveRecord ç±»ï¼æ
è°ç¨å
¶ save æ¹æ³å?¯ä»¥å°è¯è®ºè®°å½ä¿?åå°æ°æ?®åºä¸ãæ¥ç?ææ?åä¿?åè®°å½çæ¶æ?¯æ¾å° flash ä¸ã代ç ?ç¶å?è°ç¨ show å¨ä½ï¼è½½å
¥ show.rhtml 页é?¢ã该页é?¢å°é?æ°è½½å
¥æç« åä¸å®ç¸å
³çææè¯è®ºï¼å
æ¬æ°æ·»å ç飿?¡ã
ä¿®æ¹è§å¾ä»¥æ·»å è¯è®º
ç¼ç¼ show.rhtml æä»¶ï¼æ¾ç¤ºå?ç¬ç blog æ?¡ç®ã
-
å±å¼âViewsâ?> blogï¼ç¶å?æå¼
show.rhtmlã
-
å¨ show.rhtml æä»¶æ«å°¾æ·»å ä¸å代ç ?ï¼
代ç ?ç¤ºä¾ 6ï¼show.rhtml æé代ç ? |
<hr>
<h4>Comments</h4>
<% form_tag :action => 'post_comment' do %>
<p><label for="comment_comment">Comment</label><br/>
<%= text_area 'comment', 'comment' %></p>
<%= submit_tag "Post" %>
<%end %>
|
æ¤æ®µä»£ç ?产çä¸ä¸ªè¡¨å?ï¼å
æ¬ä¸ä¸ªç¨äºç¼åè¯è®ºçææ¬è¾å
¥åºï¼åä¸ä¸ªæ è¯ä¸º Post çæ??交æé®ï¼å¦å¾ 1 æç¤ºã表å?æ??交æ¶ä¼è°ç¨ post_comment å¨ä½ã
-
ä¿?åæä»¶ï¼ç¶å?è¿?è¡åºç¨ç¨åº?ã
-
ç¹å»âPermalinkâ?æ¥ç blog æ?¡ç®ç详ç»ä¿¡æ?¯ã è¯ç?卿æ¬åºæ·»å 䏿?¡è¯è®ºï¼ä½æ¯è¯·çæ?å½ç¹å»âPostâ?æé®æ¶ blog è¿ä¸?è½æ¾ç¤ºè¯è®ºã
妿æ¨çæ??交æ?åäºï¼æ¨å?¯ä»¥çå°è§å¾é¡¶é¨ä¼æä¸æ?¡æ¶æ?¯ï¼å¦ä¸å¾æç¤ºãå?é?¢å 个æ¥éª¤ï¼æä»¬å°æ·»å 代ç ?æ?¥æ¶éå¹¶æ¾ç¤ºè¿äºè¯è®ºã
å¾ 1ï¼æ²¡ææ¾ç¤ºè¯è®ºçè¯è®ºæ¨¡åè§å¾
æ¾ç¤ºè¯è®º
blog ç®å?è¿ä¸?è½æ¾ç¤ºè¯»è
æ·»å çè¯è®ºï¼æä»¥ç°å¨æ?¥è§£å³è¿ä¸ªé®é¢ã
-
å¨ blog_controller.rb 䏿¥æ¾ show å¨ä½ï¼ç¶å?æ?å
¥ä¸é?¢ç post_comments å®ä¾å?é?æ?¥æ¶éè¯è®ºã
代ç ?ç¤ºä¾ 7ï¼blog_controller.rb æé代ç ? |
def show
@post = Post.find(params[:id])
@post_comments = @post.comments.collect
flash[:post_id] = @post.id
end
|
ç±äºç»æç« æ¨¡åæ·»å äº has_many :comments å
³ç³»ï¼å?¯ä»¥éè¿è°ç¨ @post.comments æ?¥è®¿é®ä¸ç¯æç« çææè¯è®ºã
-
ä¿®æ¹ show.rhtmlï¼å°ä¸é?¢ <ul> æ ç¾çå
容å¤?å¶ç²è´´å° <h4>Comments</h4> è¡ä¸é?¢ï¼
代ç ?ç¤ºä¾ 8ï¼show.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>
|
æ¤æ®µä»£ç ?设å®è¯è®ºæ¾ç¤ºé£æ ¼ï¼ä»¥ç¬¦å?å表æ¾ç¤ºè¯è®ºï¼å?æ¶å å
¥è¯è®ºå?è¡¨çæ¥æåæ¶é´ã
-
éæ©âæä»¶â?>âå
¨é¨ä¿?åâ?ï¼ç¶å?å·æ°æµ?è§å¨ã
ç°å¨è¯è®ºå°±ä»¥ç¬¦å?·å表çå½¢å¼?æ¾ç¤ºå¨ blog ä¸äºï¼å¦ä¸å¾æç¤ºã
å¾ 2ï¼æ¾ç¤ºè¯è®ºçè¯è®ºæ¨¡åè§å¾
æ´å¤å
容
>> æ´å¤ NetBeans Ruby ææ¡£