在我的应用中,我想定义一个我的模型,视图和控制器将使用的类。我的想法是创建一个新目录app/lib
,我在其中创建:
# /app/lib/donut.rb
class Donut
def initialize(sprinkle_color)
@sprinkle_color = sprinkle_color
end
def sprinkle_color
@sprinkle_color
end
end
现在这样可以正常工作,但是当我添加test/lib
时,我运行rake test
时不会运行这些测试。我可以运行有效的rake test:all
,但感觉不对。
这是放置课程的正确位置,如果是,我如何让他们参加考试?
P.S。为什么我需要这样的课程?当然,我实际上并没有制作甜甜圈。它是一个接受一组参数的类,并且有许多模型具有这些对象。此外,还有一些视图可以获取这些对象或这些对象的数组。最后,有代码对这些对象的列表进行操作,并且我已将该代码作为静态方法放入此类中。
答案 0 :(得分:2)
在app目录中为自定义类创建文件夹,但尝试使其尽可能具有描述性。对于例如我使用自定义类来正确格式化json for ajax loading datatables所以这些类位于app>datatables
,例如。
app>datatables>users_datatable.rb
class UsersDatatable
[...]
end
因此在控制器操作中,我可以使用自定义类渲染视图:
respond_to do |format|
format.html
format.json { render json: UsersDatatable.new(view_context, current_user) }
end
这是另一个使用prawn pdf生成pdf视图的示例:
app>pdfs>quote_pdf.rb
class QuotePdf < Prawn::Document
[...]
end
在控制器动作中:
respond_to do |format|
format.html
format.pdf do
pdf = QuotePdf.new(view_context, @quote)
send_data pdf.render, filename: "quote_#{@quote.number}.pdf",
type: "application/pdf",
disposition: "inline"
end
end
测试很简单。由于我使用的自定义类与其他资源相关联,因此我将它们包含在测试中。即与用户,报价。但是,您可以创建单独的测试,以便能够单独运行它们。
我认为app>lib
描述性不够。如果可能的话,尝试更具体地说明自定义类实际上在做什么。
答案 1 :(得分:0)
我真的不喜欢使用&#34; lib&#34;。相反,我建议使用通用设计模式作为其他PORO的顶级目录名称。我在Rails项目中这样做。所以我有这样的事情:
app/
models/
controllers/
services/
policies/
validators/
等
可以在此处找到一个很好的展示:http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/