带有Rails的敏捷Web开发(第三版)是否教授最佳实践以及Rails编码?
我担心的是,当我使用这本书时,我正在开发坏的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");
我知道他们可能只是试图演示类级别的方法,但是他们并没有在代码中添加任何警告,说明这并不是您应该这么做的。
发布于 2010-09-08 20:50:10
我觉得你本可以这么做的。
但有时,当进行复杂的查找时,最好将其抽象为定制的find语句。应用模型特定的业务规则等,应在模型内部而不是控制器内执行。所以这并不是个坏主意。
您甚至可以使用named_scopes来做类似的事情。请查收更多信息
http://railscasts.com/episodes/108-named-scope
发布于 2010-09-08 20:55:25
我不能代表整本书,但从你的例子来看,我发现这不是一个坏的编码习惯,而是一个好的习惯。
它实际上不是一个助手方法,它是Product类上的一个特定查询,应该这样命名/声明。
将来,如果您需要改变find_products_for_sale工作方式的功能--我觉得这个命名有点奇怪,我更喜欢for_sale-then--您可以在模型中这样做,而不需要碰您的控制器。如果您的控制器中有多个使用find_products_for_sale的操作,那么您就有效地节省了大量输入/潜在的麻烦。
现在,对于这些类型的事物,有了named_scope( Rails 3,即scope),这是一种更好的表述它们的方法。
https://stackoverflow.com/questions/3671713
复制相似问题