繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM