2011-02-06 63 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