Rails 增加一個模型(model)


 

 

之前我們已經看到用腳手架運行的model程序。現在是時候第二個model了。

第二個model用來處理post的評論。


7.1 新建一個模型

Rails模型使用一個單一的名稱,相應的數據庫使用復數名稱

像模型來處理comments表,模型的名字所comment。即使你不想使用

腳手架來產生全部代碼。很多程序還是用generators來產生控制器和模型。

新建一個模型可以像下面一樣:運行命令。

[html] view plain copy
  1. $ rails generate model Comment commenter:string body:text post:references  

這個命令將會生成下面幾個文件

  • app/models/comment.rb – 模型文件
  • db/migrate/20100207235629_create_comments.rb – DB整合文件
  • test/unit/comment_test.rb and test/fixtures/comments.yml –測試配置文件

首先我們看下模型文件

[html] view plain copy
  1. class Comment < ActiveRecord::Base  
  2.   belongs_to :post  
  3. end  


這個和post.rb非常類似。不同點就是這有個belongs_to :post.

這是activerecord的關系設置。你將會在下面學到更多關於設定表之間的關系。

除了增加模型之外,rails還生成了創建表的整合代碼。

[html] view plain copy
  1. class CreateComments < ActiveRecord::Migration  
  2.   def change  
  3.     create_table :comments do |t|  
  4.       t.string :commenter  
  5.       t.text :body  
  6.       t.references :post  
  7.    
  8.       t.timestamps  
  9.     end  
  10.    
  11.     add_index :comments, :post_id  
  12.   end  
  13. end  

t.references這行是設定和post模型的外鍵。

add_index這行是設定這個外鍵作為索引。

繼續向下進行db整合運行

[html] view plain copy
  1. $ rake db:migrate  

rails是足夠聰明的,他只運行DB中還沒有運行的整合。

[html] view plain copy
  1. ==  CreateComments: migrating =================================================  
  2. -- create_table(:comments)  
  3.    -> 0.0017s  
  4. ==  CreateComments: migrated (0.0018s) ========================================  


7.2 關聯模型

ActiveRecord可以讓你很簡單的設定2個模型之間的關系。在comments和posts2個模型之間,

你可以通過這個方式寫出他們的關系。

  • 每個comment 屬於一個 post (1對1)
  • 一個post 有很多的 comments (1對多)

事實上,rails使用非常接近的語法來聲明這種關系。你已經看到在comment模型代碼中,

聲明了每個comment屬於一個post。

[html] view plain copy
  1. class Comment < ActiveRecord::Base     
  2.   belongs_to :post  
  3. end   

 

你需要編輯post.rb模型代碼來聲明上面的一對多關系。

[html] view plain copy
  1. class Post < ActiveRecord::Base     
  2.   validates :name,  :presence => true    
  3.   validates :title, :presence => true, :length => { :minimum => 5 }      
  4.    has_many :comments  
  5. end   


這2個聲明可以使用很多自動行為。例如:如果你有一個實例變量

@post包含 一個post,你可以取得所有屬於post的comments。通過

@post.comments方法返回一個數組。

7.3 給comments增加一個路由

像我們設置主頁一樣。我們需要增加一個路由來讓我們導航可以瀏覽

comments。打開config/routes.rb文件,你將會發現posts已經在里面了。

這是由腳手架自動生成的。編輯他們像下面一樣。

[html] view plain copy
  1. resources :posts do   
  2.    resources :comments  
  3. end   

這個建立comments是一個posts的嵌套資源。捕捉post和comment之間存在層次關系另一部分


 7.4 產生一個控制器

模型產生完之后。是時候產生對應的控制器了。

[html] view plain copy
  1. $ rails generate controller Comments   

這個命令產生了6個文件和一個空文件夾。

  • app/controllers/comments_controller.rb – 控制器
  • app/helpers/comments_helper.rb – 視圖的幫助文件
  • test/functional/comments_controller_test.rb – 控制器的測試程序
  • test/unit/helpers/comments_helper_test.rb – 幫助的測試代碼
  • app/views/comments/ – 控制器的視圖代碼放在這
  • app/assets/stylesheets/comment.css.scss – 控制器的樣式
  • app/assets/javascripts/comment.js.coffee – 控制器的CoffeeScript

像很多博客一樣,我們的讀者將會創建評論在讀完博客之后。一旦他們評論完,

將會調用post的顯示頁面,可以看到他們的評論。根據這些,我們的CommentsController

應該提供創建評論和刪除垃圾評論的方法。

所以首先我們修改post的顯示頁面(/app/views/posts/show.html.erb)可以讓我們增加評論

[html] view plain copy
  1. <p class="notice"><%= notice %></p>   
  2.     
  3. <p>   
  4.   <b>Name:</b>   
  5.   <%= @post.name %>  
  6. </p>   
  7.     
  8. <p>   
  9.   <b>Title:</b>   
  10.   <%= @post.title %>  
  11. </p>   
  12.     
  13. <p>   
  14.   <b>Content:</b>   
  15.   <%= @post.content %>  
  16. </p>   
  17.     
  18. <h2>Add a comment:</h2>   
  19. <%= form_for([@post, @post.comments.build]) do |f| %>  
  20.   <div class="field">   
  21.     <%= f.label :commenter %><br />   
  22.     <%= f.text_field :commenter %>  
  23.   </div>   
  24.   <div class="field">   
  25.     <%= f.label :body %><br />   
  26.     <%= f.text_area :body %>  
  27.   </div>   
  28.   <div class="actions">   
  29.     <%= f.submit %>  
  30.   </div>   
  31. <% end %>  
  32.     
  33. <%= link_to 'Edit Post', edit_post_path(@post) %> |   
  34. <%= link_to 'Back to Posts', posts_path %> |  

這個加進去的form是新建一個新的評論,將會調用
CommentsController的create方法。
[html] view plain copy
  1. class CommentsController < ApplicationController   
  2.   def create   
  3.     @post = Post.find(params[:post_id])   
  4.     @comment = @post.comments.create(params[:comment])   
  5.     redirect_to post_path(@post)   
  6.   end  
  7. end   

你會看到這里面的處理會比post控制器的處理稍微復雜一點。這個設置了一個嵌套機制。每個評論都會跟隨post。

所以在一開始進行了Post的查找。

 

同時,代碼使用了模型關聯的一些方法。我們使用@post.comments的create方法來新建保存評論。

這個將會自動連接comment因為他從屬於post。

 

一旦我們新建完評論,我們將用戶回到原來的頁面通過post_path(@post)

正如我們所看到的,他將會調用PostsController的show動作,這時候我們希望

評論顯示在此頁面上。所以我們修改頁面代碼。

[html] view plain copy
  1. <p class="notice"><%= notice %></p>  
  2.    
  3. <p>  
  4.   <b>Name:</b>  
  5.   <%= @post.name %>  
  6. </p>  
  7.    
  8. <p>  
  9.   <b>Title:</b>  
  10.   <%= @post.title %>  
  11. </p>  
  12.    
  13. <p>  
  14.   <b>Content:</b>  
  15.   <%= @post.content %>  
  16. </p>  
  17.    
  18. <h2>Comments</h2>  
  19. <% @post.comments.each do |comment| %>  
  20.   <p>  
  21.     <b>Commenter:</b>  
  22.     <%= comment.commenter %>  
  23.   </p>  
  24.    
  25.   <p>  
  26.     <b>Comment:</b>  
  27.     <%= comment.body %>  
  28.   </p>  
  29. <% end %>  
  30.    
  31. <h2>Add a comment:</h2>  
  32. <%= form_for([@post, @post.comments.build]) do |f| %>  
  33.   <div class="field">  
  34.     <%= f.label :commenter %><br />  
  35.     <%= f.text_field :commenter %>  
  36.   </div>  
  37.   <div class="field">  
  38.     <%= f.label :body %><br />  
  39.     <%= f.text_area :body %>  
  40.   </div>  
  41.   <div class="actions">  
  42.     <%= f.submit %>  
  43.   </div>  
  44. <% end %>  
  45.    
  46. <br />  
  47.    
  48. <%= link_to 'Edit Post', edit_post_path(@post) %> |  
  49. <%= link_to 'Back to Posts', posts_path %> |  


這樣的話,你可以增加博客和評論,他們可以顯示在正確的位置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM