在Ruby on Rails应用程序中随处调用方法

Bac*_*cko 3 ruby methods ruby-on-rails ruby-on-rails-3

我正在使用Ruby on Rails 3.0.9,我试图从内部帮助器,控制器,模型和视图文件中调用一些方法.我想要做的是创建一个库,在我的应用程序内部构建\ standardize命名约定,以便我可以使用\运行如下所示:

standardized_name = standardize_name(Article)
Run Code Online (Sandbox Code Playgroud)

你有什么建议?

PS:我听说过mixin,但我应该如何在我的情况下使用它们?此外,我不想在每个需要使用它的类中声明包含mixin(也就是说,我希望在我的所有应用程序类中都有一个包含mixin的"唯一"语句).

mik*_*ong 6

可以在Rails MVC的所有层中访问的类似库是I18n.您可以使用I18n.t调用translate方法,而视图和控制器层中有一个辅助方法,因此您不需要每次都输入整个"I18n.t".

我们可以按照I18n的说法去做.您可以在应用程序的lib目录中创建一个模块.确保更新application.rb以便加载模块.在application.rb中查找此注释:

# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
Run Code Online (Sandbox Code Playgroud)

显然,如果取消注释autoload_paths行,请将"extras"更改为"lib".

这是一个示例模块lib/Karate.rb:

module Karate
  class << self
    def punch(grunt)
      puts "#{grunt}! *punch*"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

现在您可以在应用程序的任何位置调用它:

Karate.punch("boom")
# => boom! *punch*
Run Code Online (Sandbox Code Playgroud)

如果要在View和Controller层中使用辅助方法,只需在application_controller.rb中添加一个方法:

def punch(grunt)
  Karate.punch(grunt)
end
Run Code Online (Sandbox Code Playgroud)

并将此方法声明为辅助方法(也在application_controller.rb中),如下所示:

helper_method :punch
Run Code Online (Sandbox Code Playgroud)

但是,请确保您真的需要这个库.我没有质疑你的理由,因为它不会回答你的主要问题.我认为您应该在代码中练习您的命名约定,如果必须,请将其添加到README中,或者向您的团队发送电子邮件.此外,Rails和Ruby已经有了命名约定,所以一定要了解它.