2011-02-06 62 views
2

要啓動此代碼屬於,我是一個相當新的到Rails是否在模型或控制器

我已經創造了一些方法,並把它們放到我的模型,但它看起來凌亂,如果代碼只是想知道屬於模型還是控制器?什麼讓我的代碼獨特(每個控制器不是一個模型)是我只有一個模型「產品」,但有3個控制器與它交互,「商家,類別,品牌」。也許有一種更簡單的方法,我完全忽略了?我真的不想將數據分成3個表格/模型之間的鏈接。

p.s.這是我第一次擺脫Rails書籍的安慰,所以請放輕鬆點!任何其他一般的建議,我的代碼將不勝感激。

產品型號

class Product < ActiveRecord::Base 

    validates :brand, :presence => true 

    def product_name 
    name.capitalize.html_safe 
    end 

    def product_description 
    description.html_safe 
    end 

    #Replace '-' with ' ' for nice names 
    def brand_name 
    brand.capitalize.gsub('-',' ') 
    end 

    def category_name 
    category.capitalize.gsub('-',' ') 
    end 

    def merchant_name 
    merchant.capitalize.gsub('-',' ') 
    end 

    #Replace ' ' with '-' for urls 
    def brand_url 
    brand.downcase.gsub(' ','-') 
    end 

    def category_url 
    category.downcase.gsub(' ','-') 
    end 

    def merchant_url 
    merchant.downcase.gsub(' ','-') 
    end 

end 

招控制器

class MerchantsController < ApplicationController 

    def index 
    @merchants = Product.find(:all, :select => 'DISTINCT merchant') 
    end 

    def show 
    @products = Product.find(:all, :conditions => ['merchant = ?', params[:merchant]]) 
    @merchant = params[:merchant].capitalize.gsub('-',' ') 
    end 

end 

商家視圖(指數)

<h1>Merchant list</h1> 

<%= @merchants.count%> merchants found 

<% @merchants.each do |merchant| %> 

    <p><%= link_to merchant.merchant_name, merchant.merchant_url %></p> 

<% end %> 

商家視圖(顯示)

<h1>Products from merchant: <%= @merchant %></h1> 

<%= @products.count%> products found 

<% @products.each do |product| %> 

    <h3><%= product.product_name %></h3> 

    <p> 
    <img src="<%= product.image %>" align="right" alt="<%= product.product_name %>" /> 
    <%= product.product_description %> 
    </p> 

    <p><%= product.price %></p> 

    <p>Brand: <%= product.brand_name %></p> 

    <p>Category: <%= product.category_name %></p> 

    <p>Sub category: <%= product.sub_category %></p> 

    <p>Merchant: <%= product.merchant_name %></p> 

    <p><a href="<%= product.link %>" target="_blank">More information</a></p> 

    <hr /> 

<% end %> 

回答

4

因此,您的數據模型確實似乎已經到了可能至少要分拆商戶的地步​​。您可以通過選擇「DISTINCT商家」查詢來說明這一點。如果您的商家是基於用戶的輸入並保存在您的產品表中,那麼將它們轉移到自己的模型中似乎是個好時機,這樣他們就可以輕鬆搜索和管理。隨着您獲得更多商家和更多產品,執行此查詢將變得越來越困難。一旦你想添加額外的商家信息,你也會處於更糟糕的位置。請記住Rails是爲了輕鬆重構而製作的。進行這種改變不應該讓人望而生畏,它應該只是您敏捷開發過程中的另一個常規任務。

什麼上面的變化也將允許你做的是改變這些行:

 
@products = Product.find(:all, :conditions => ['merchant = ?', params[:merchant]]) 
@merchant = params[:merchant].capitalize.gsub('-',' ') 

到:

 
@merchant = Merchant.find_by_name(params[:name]) 
@products = @merchant.products 

然後,您可以有一個模型功能的利用和GSUB名稱:

 
@merchant.display_name 

下一步是幹掉你的模型代碼,例如:

 
class Product 
    def brand_name 
    make_name brand 
    end 

    def category_name 
    make_name category 
    end 

    def merchant_name 
    make_name merchant 
    end 

    private 

    def make_name name 
    name.capitalize.gsub('-', ' ') 
    end 
end 

你也可以做一些類似於_url函數的東西。如果你想進一步冒險,你也可以使用元編程來清理它。

最後的想法:確保你真的想在你的字符串上調用html_safe。如果他們是基於用戶的輸入,最好讓他們通過視圖中的h函數。您是否希望用戶能夠以品牌,商家和類別的形式輸入HTML字符串?如果是這樣,則將html_safe字符串留在那裏,否則讓字符串在您的視圖中成爲html_safe。

一般來說,你是在正確的道路上:瘦瘦的控制器和視圖和脂肪模型是要走的路。這意味着將您的邏輯和重載放到您的模型中,讓您的控制器和視圖變得小巧簡單。

2

公約是隻是,常規的。無論亞特蘭大有誰告訴你有沒有對或錯。 F#$ k他。不管怎麼說,如果你打算使用Skinny Controller Fat模型,那麼是的,你正處於正確的軌道上。

正如他們所說,在你的模型中完成所有繁重的工作。

我希望在模型中親自重構這些方法。所有這些地方你打電話* .downcase.gsub ...

也看看to_param,你可以覆蓋,以獲得purdy網址的方法。

3

你應該規範你的數據庫。您需要三張桌子,而不是一張:產品,商家和品牌。然後,您的產品表將參考商戶和品牌表。然後你可以有獨立的模型(在它們之間有belongs_to/has_many關係)和單獨的控制器。

您仍然可以編寫像product.merchant.name這樣的東西,但您的一些代碼會更簡單。

+0

我想我需要正常化,謝謝 – Zinc 2011-02-06 18:54:27