2010-09-08 27 views
0

是否使用Ruby on Rails進行敏捷Web開發(第三版)教授最佳實踐以及Rails編碼?使用Ruby on Rails進行敏捷Web開發(第三版)創建糟糕的編碼習慣?

我擔心的是,在我使用本書時,我正在開發由本書中使用的示例的基本性質導致的糟糕的Rails編碼習慣。案例在點:

產品型號:

class Product < ActiveRecord::Base 
    def self.find_products_for_sale 
    find(:all, :order => "title") 
end 

存儲控制器

class StoreController < ApplicationController 
    def index 
    @products = Product.find_products_for_sale 
    end 
end 

存儲索引視圖

<h1>Your Pragmatic Catalog</h1> 
<% @products.each do |product| -%> 
    <div class="entry"> 
    <%= image_tag(product.image_url) %> 
    <h3><%=h product.title %></h3> 
    <%= product.description %> 
    <div class="price-line"> 
    <span class="price"><%= product.price %></span> 
    </div> 
    </div> 
<% end %> 

爲了吸引目錄中所有可用的產品,聲明一個「幫助器」函數是否是一種最佳實踐?他們不應該這樣做嗎?

@products = Products.find(:all, :order => "title");

據我所知,他們可能只是試圖展示類級別的方法,但他們不會在代碼中添加任何警告,指出這不是真的你應該如何做到這一點。

回答

2

我覺得在這個特定的情況下你可以做到這一點。

但是有時候在進行復雜的查找時,最好將其抽象爲自定義查找語句。應用模型特定的業務規則等,應該在模型內而不是控制器內完成。所以它不是一個壞主意。

你甚至可以使用named_scopes來做類似的事情。檢查出這更多

http://railscasts.com/episodes/108-named-scope

2

我不能爲這本書的全部發言,但是從你的榜樣,我不覺得這是一個壞習慣的編碼,但一個好的。

這不是一個真正的輔助方法,它是您的Product類中的一個特定查詢,應該按照這種方式命名/聲明。在未來,如果你需要改變find_products_for_sale工作方式的功能 - 我覺得這個命名有點奇怪,我更喜歡for_sale - 那麼你可以在模型中做到這一點,而不必觸摸你的控制器。如果您的控制器中有多個使用find_products_for_sale的操作,那麼您已經有效地爲自己節省了一些鍵入/潛在的麻煩。

現在有named_scope s(和Rails 3一樣,只是scope)對於這些類型的東西來說是更好的方式來說明它們。

相關問題