[英]Where would i put a method/variable that will be used in my models/views/controllers?
[英]Where should I put my own classes that are not models/views/controllers?
在我的应用程序中,我想定义一个我的模型,视图和控制器将使用的类。 我的想法是创建一个新目录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
。 我可以进行rake test:all
正常,但感觉不对。
这是放置课程的正确位置吗?如果是,我如何让它们进入测试?
PS为什么我需要这样的课程? 当然,我实际上并没有创造一个甜甜圈。 这是一个带有一组参数的类,并且许多模型都有这些对象。 此外,还有采用这些对象或这些对象的数组的视图。 最后,有对这些对象的列表进行操作的代码,我已将该代码作为静态方法放入此类。
在app目录中为自定义类创建文件夹,但请尝试使其尽可能具有描述性。 对于如我用自定义类正确格式为Ajax加载JSON 数据表 ,因此类位于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
这是另一个使用大虾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
的描述性不够。 如果可能,请尝试并更具体地说明定制类的实际作用。
我真的不喜欢使用“ lib”。 相反,我建议使用常见的设计模式作为其他PORO的顶级目录名称。 我在Rails项目中做到这一点。 这样我就有这样的东西:
app/
models/
controllers/
services/
policies/
validators/
等等。
可以在这里找到一个很好的展示: http : //blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.