我应该在哪里放置我自己的不是模型/视图/控制器的类?

时间:2014-07-06 23:17:47

标签: ruby-on-rails ruby testing ruby-on-rails-4

在我的应用中,我想定义一个我的模型,视图和控制器将使用的类。我的想法是创建一个新目录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。为什么我需要这样的课程?当然,我实际上并没有制作甜甜圈。它是一个接受一组参数的类,并且有许多模型具有这些对象。此外,还有一些视图可以获取这些对象或这些对象的数组。最后,有代码对这些对象的列表进行操作,并且我已将该代码作为静态方法放入此类中。

2 个答案:

答案 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/