Ruby on rails 在RubyonRails应用程序中到处调用方法

Ruby on rails 在RubyonRails应用程序中到处调用方法,ruby-on-rails,ruby,ruby-on-rails-3,methods,Ruby On Rails,Ruby,Ruby On Rails 3,Methods,我正在使用RubyonRails3.0.9,我正在尝试从所有帮助器、控制器、模型和视图文件内部调用一些方法。我想创建一个库,在我的应用程序内部构建\标准化命名约定,以便我可以使用\运行如下内容: standardized_name = standardize_name(Article) 你有什么建议? 附言:我听说过mixin,但是我应该如何在我的案例中使用它们呢?此外,我不想声明在需要使用该mixin的每个类中包含该mixin(也就是说,我希望有一个“唯一”语句,将该mixin包含在我的所有

我正在使用RubyonRails3.0.9,我正在尝试从所有帮助器、控制器、模型和视图文件内部调用一些方法。我想创建一个库,在我的应用程序内部构建\标准化命名约定,以便我可以使用\运行如下内容:

standardized_name = standardize_name(Article)
你有什么建议?


附言:我听说过mixin,但是我应该如何在我的案例中使用它们呢?此外,我不想声明在需要使用该mixin的每个类中包含该mixin(也就是说,我希望有一个“唯一”语句,将该mixin包含在我的所有应用程序类中)。

在Rails MVC的所有层中都可以访问的类似库是I18n。您可以使用I18n.t调用translate方法,而视图和控制器层中有一个helper t方法,因此您不需要每次都键入整个“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)
显然,如果取消自动加载路径行的注释,请将“extras”更改为“lib”

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

module Karate
  class << self
    def punch(grunt)
      puts "#{grunt}! *punch*"
    end
  end
end
如果要在视图和控制器层中使用帮助器方法,只需在application_Controller.rb中添加一个方法:

def punch(grunt)
  Karate.punch(grunt)
end
并将此方法声明为助手方法(也在application_controller.rb中),如下所示:

helper_method :punch

但是,请确保你真的需要这个图书馆。我没有质疑你的理由,因为它不会回答你的主要问题。我认为你应该在你的代码中练习你的命名约定,如果有必要的话可以在自述中添加它,或者给你的团队发送一封电子邮件。另外,Rails和Ruby已经有了命名约定,所以一定要了解它

根据您的用例,您可以采用以下方法之一将方法附加到它所作用的对象上。然后,您不需要在任何您想使用的地方都包含
标准化\u name
方法;您只需将它集中在应用它的对象上:

用作Article.U名称(类方法):

如果您的代码>标准化名称>代码>方法只将AccVIECORD模型作为参数,考虑将其放入一个模块中(在<代码> LIB/标准化.RB < /代码>中),并将其扩展到<代码> ActureCordR::Base< /Cord>(或者是其他所有域类的父类):

或者,如果您不想将其包含在所有模型中,只需将模块包含在您希望
标准化\u name
可用的各个类中即可:

class Article < ActiveRecord::Base
  extend Standardizable
end
要用作Article.new.u名称(实例方法): 如果您希望在模型类的实例上使用该方法,只需将上述示例中的
extend
更改为
include

module Standardizable
  def standardized_name
    # in here, self will be the model object *instance*,
    # so the following will return "Article" if you
    # included the module into the Article class:
    self.class.name
  end
end

# include the mixin in all ActiveRecord models:
ActiveRecord::Base.send(:include, Standardizable)
用法如下所示:

article = Article.new

standardized_name = article.standardized_name
使用ActiveSupport结束::关注点: 在Rails 3中总结这两种方法的好方法是:

然后,您可以使用class和instance方法来获取标准化名称:

standardized_name_from_class = Article.standardized_name
article = Article.new
standardized_name_from_instance = article.standardized_name

如果我想扩展所有类(也是字符串类)来运行'Article.standardarized_name'和'Some_String.standarized_name',那么只需执行:
Object.extend(standarized)
。但不建议这样做:这意味着您的模块需要能够处理任何可能的类型,并且会污染全局名称空间。不过,仅扩展String类是相当常见的,并且是由ActiveSupport等广泛完成的。
module Standardizable
  def standardized_name
    # in here, self will be the model object *instance*,
    # so the following will return "Article" if you
    # included the module into the Article class:
    self.class.name
  end
end

# include the mixin in all ActiveRecord models:
ActiveRecord::Base.send(:include, Standardizable)
article = Article.new

standardized_name = article.standardized_name
module Standardizable
  extend ActiveSupport::Concern

  module ClassMethods
    def standardized_name
      self.name
    end
  end

  module InstanceMethods
    def standardized_name
      self.class.standardized_name
    end
  end
end

ActiveRecord::Base.extend Standardizable
standardized_name_from_class = Article.standardized_name
article = Article.new
standardized_name_from_instance = article.standardized_name