【问题标题】:Does this code belong in the model or controller此代码是否属于模型或控制器
【发布时间】:2011-02-06 18:36:48
【问题描述】:

首先,我是 Rails 的新手

我创建了一些方法并将它们放入我的模型中,但它看起来很乱,只是想知道代码是属于模型还是控制器?是什么让我的代码独一无二(每个控制器都不是一个模型)是我只有一个模型“产品”,但有 3 个与之交互的控制器,“商家、类别、品牌”。也许我完全忽略了一种更简单的方法?我真的不想将数据拆分为 3 个表/模型之间的链接。

附言这是我第一次从舒适的 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 %>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    因此,您的数据模型似乎已经到了您可能至少想要将商家分开的地步。您可以从选择“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

    下一步是稍微干掉你的模型代码,例如:

    类产品 def 品牌名称 名牌 结尾 定义类别名称 make_name 类别 结尾 def 商户名 make_name 商人 结尾 私人的 def make_name 名称 name.capitalize.gsub('-', ' ') 结尾 结尾

    您也可以执行类似于 _url 函数的操作。如果你想进一步冒险,你也可以使用元编程来清理它。

    最后的想法:确保你真的想在你的字符串上调用 html_safe。如果它们是基于用户的输入,最好让它们通过视图中的 h 函数。您是否希望用户能够输入 HTML 字符串作为品牌、商家和类别?如果是这样,则将 html_safe 字符串保留在那里,否则让字符串在您的视图中变为 html_safe。

    总的来说,您走在正确的道路上:Skinny Controllers 和 Views 以及 Fat Models 是要走的路。这意味着将您的逻辑和繁重的工作放入模型中,让您的控制器和视图小而简单。

    【讨论】:

      【解决方案2】:

      您可能应该规范化您的数据库。您需要 3 张表而不是一张:Products、Merchants 和 Brands。然后,您的产品表将包含对商家和品牌表的引用。然后,您可以拥有单独的模型(它们之间具有 belongs_to/has_many 关系)和单独的控制器。

      您仍然可以编写product.merchant.name 之类的内容,但您的某些代码会更简单。

      【讨论】:

        【解决方案3】:

        约定就是这样,约定俗成的。无论亚特兰大的谁告诉你有对错,都没有对错之分。 F#$k 他。

        无论如何,如果您要使用 Skinny Controller Fat 模型,那么是的,您走在正确的轨道上。

        正如他们所说,在您的模型中完成所有繁重的工作。

        我希望在模型中亲自重构这些方法。所有你调用 *.downcase.gsub 的地方...

        还可以查看 to_param,这是一种您可以覆盖以获取 purdy url 的方法。

        【讨论】:

          猜你喜欢
          • 2012-09-03
          • 2012-10-26
          • 1970-01-01
          • 1970-01-01
          • 2012-02-08
          • 2012-08-16
          • 1970-01-01
          • 2016-01-25
          • 1970-01-01
          相关资源
          最近更新 更多