【问题标题】:How to create and use a module using Ruby on Rails 3?如何使用 Ruby on Rails 3 创建和使用模块?
【发布时间】:2011-02-05 12:54:45
【问题描述】:

我正在使用 Ruby on Rails 3,我想在模块中移动一些自定义和共享代码。

  1. 我应该使用什么语法来编写模块代码?
  2. 我必须在我的应用程序的哪个文件夹中放置模块文件?
  3. 如何将该模块包含在一个或多个控制器类中?
  4. 如果有的话,我还必须在我的应用程序的任何位置使用自定义模块吗?
  5. 如何从我的应用程序调用模块中的方法?

提前致谢。

【问题讨论】:

  • 非常好!我需要它。

标签: ruby-on-rails-3 module


【解决方案1】:

到 1. 一个模块被创建/打开 简单地说:

module MyModule
  def first_module_method
  end
end

到 2.lib 文件夹。如果您想在lib 文件夹中组织您的模块,您可以将它们自己放入模块中。例如,如果您想要一个子文件夹super_modules,您的模块将定义如下:

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

到 3./5。当在类中包含模块时,您可以简单地调用模块方法,就好像它们是在类中定义的一样:

class MyClass
  include MyModule
  def some_method
    first_module_method #calls module method
  end
end

到 4。 首先,确保应用程序的每个类都需要您的模块。如果不是的话,只在需要的地方包含它是有意义的,以免使不需要它的类膨胀。如果您真的希望在任何地方都使用该模块,请查看应用程序中类的类层次结构。您想要所有型号的模块吗?你可以打开 ActiveRecord::Base 并在那里添加你的模块。

【讨论】:

  • 为了组织文件,我可以在'lib'文件夹中创建一个子文件夹吗?如果有,有什么变化?
  • @user502052 我已经更新了第 2 点的答案来回答这个问题。
  • 这里有很多不清楚的地方。要给出什么文件名?不包括所有模块时如何调用方法?我不敢相信有这么多赞成票,因为我最后仍然不知道如何使用模块。
  • 一旦通过将它包含在lib 文件夹中来创建一个如上所述的模块,重要的注意事项是使Rails3 能够取消注释config\application.rb 中的行config.autoload_paths - 阅读例如@987654321 @ ... 另请注意,您必须小心为您的模块使用与模块名称本身匹配的文件名。所以如果你把它保存在lib/test/my_module.rb,你必须include Test::MyModule——更多细节见stackoverflow.com/questions/4073856/rails-3-autoload
  • 我刚刚找到了我的这个旧答案。 :( 我想投反对票。不要在 lib 中放任何东西!如果代码需要访问其他模型,请将您的代码(包括附加模块)放入 app/models。如果您的代码确实是一个“库”并且可以存在于其上自己的,我建议vendoring一个gem。例如,见github.com/shageman/the_next_big_thing
【解决方案2】:

一个>1。您可以使用与任何其他 ruby​​ 类相同的语法。例如,我正在定义一个 VehicleClassifer 模块,该模块将使用分类车辆方法根据车辆作为输入接收到的车轮数量对车辆进行分类。

module VehicleClassifer
  def classify_vehicle(number_of_wheels)
    VehicleType.where("number_of_wheels = ?", number_of_wheels)
  end
end

A>2。模块通常存储在 /lib 文件夹中。

问题 3、4、5 的答案大致相同。你可以使用

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

在您使用模块的类中,您将可以访问模块的所有方法。

此外,如果您需要在整个应用程序中使用模块,您可以将它包含在您的应用程序控制器中。

【讨论】:

  • 我尝试了这个并且得到了一个未定义的方法错误。知道我做错了什么吗?
  • 您确定您的模块可以访问吗? stackoverflow.com/questions/6604272/… 或许能帮到你?
  • @Tony - 您可能需要重新启动服务器 - 即使在开发模式下,才能使模块的方法可用。并且每次更改模块中的代码时,都必须重新启动服务器。例如,如果出现错误,或者它会在旧代码上出错,但在错误消息中突出显示该行上的新代码 - 非常混乱。
  • 知道如何在ApplicationHelper 中包含和使用这些自定义模块吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
相关资源
最近更新 更多