Ruby on rails 3 如何在Rails 3的控制器中使用mixin或模块?
我的控制器中有一些行为,我把它们拉到一个模块中,以便更好地测试并在一些地方重复使用。关于这一点,有两个问题:Ruby on rails 3 如何在Rails 3的控制器中使用mixin或模块?,ruby-on-rails-3,mixins,Ruby On Rails 3,Mixins,我的控制器中有一些行为,我把它们拉到一个模块中,以便更好地测试并在一些地方重复使用。关于这一点,有两个问题: 哪里是放置模块的好地方?它们需要运行才能供控制器使用,所以我考虑的是config/initializers/目录。不过我觉得这有点可疑库/ 如何确保代码运行,以便模块可用于我的控制器中的include 谢谢你们,先生们 lib/是模块的绝佳场所;比config/initializers/好得多——至少在我看来是这样。如果它是几个模块,或者一个大的模块,你也可以考虑把它变成一个插件,把它放
config/initializers/
目录。不过我觉得这有点可疑<代码>库/include
lib/
是模块的绝佳场所;比config/initializers/
好得多——至少在我看来是这样。如果它是几个模块,或者一个大的模块,你也可以考虑把它变成一个插件,把它放在lib/
,则需要手动require
该文件。默认情况下,Rails不会自动加载lib/
目录中的文件。您可以将require放在一个配置文件中config/application.rb
中。类似这样的操作应该可以做到(假设您的.rb
文件位于名为lib/my_module
的目录中):
您必须确保您的模块是实际的模块
,而不是类
。然后,您可以简单地将其包括在内:
# lib/my_module/foobar.rb
module Foobar
def foobar
"Hello world!"
end
end
# app/models/my_model.rb
class MyModel < ActiveRecord::Base
include Foobar
end
# rails console
>> obj = MyModel.first
=> #<MyModel id: 1, ...>
>> obj.id
=> 1
>> obj.foobar
=> "Hello world!"
#lib/my_模块/foobar.rb
Foobar模块
def foobar
“你好,世界!”
结束
结束
#app/models/my_model.rb
类MyModel>obj=MyModel.first
=> #
>>对象id
=> 1
>>obj.foobar
=>“你好,世界!”
尝试将特定于控制器的模块放入app/controllers
。没有要求
要求。1)我想说:
应用程序/扩展下的我的类扩展
我在/app/mixins下的模块
我在/app/services下的服务
2) 您可以将应用程序配置为在config/application.rb中加载所有这些内容:
类扩展应该以正确的方式进行
并且可以将mixin和服务添加到自动加载路径中
class Application < Rails::Application
# require class extentions right now
Dir[Rails.root.join('app', 'extentions', "*.rb")].each {|l| require l }
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += Dir[Rails.root.join('app', 'mixins', '{**}')]
config.autoload_paths += Dir[Rails.root.join('app', 'services', '{**}')]
类应用程序
(我使用的是rails 3)除非它们是控制器,否则它们不应该进入
app/controllers
。这违背了目录结构的目的。同意,Arbind Thakur的解决方案是最好的。我不喜欢/lib,因为在大型项目中,它肯定会变得很笨拙。下面有层次结构的应用程序/混合是我们最有可能做的。
class Application < Rails::Application
# require class extentions right now
Dir[Rails.root.join('app', 'extentions', "*.rb")].each {|l| require l }
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += Dir[Rails.root.join('app', 'mixins', '{**}')]
config.autoload_paths += Dir[Rails.root.join('app', 'services', '{**}')]