首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Rails中,如何以及在何处定义略微更改现有Rails方法的新方法

在Rails中,如何以及在何处定义略微更改现有Rails方法的新方法
EN

Stack Overflow用户
提问于 2016-02-05 08:39:29
回答 2查看 203关注 0票数 1

我正在尝试定义一个Rails的parameterize版本,它不会将结果字符串小写。

代码语言:javascript
复制
# File activesupport/lib/active_support/inflector/transliterate.rb, line 80
def parameterize(string, sep = '-')
  # replace accented chars with their ascii equivalents
  parameterized_string = transliterate(string)
  # Turn unwanted chars into the separator
  parameterized_string.gsub!(/[^a-z0-9\-_]+/, sep)
  unless sep.nil? || sep.empty?
    re_sep = Regexp.escape(sep)
    # No more than one of the separator in a row.
    parameterized_string.gsub!(/#{re_sep}{2,}/, sep)
    # Remove leading/trailing separator.
    parameterized_string.gsub!(/^#{re_sep}|#{re_sep}$/, '')
  end
  parameterized_string.downcase
end

我想我会这么做:

代码语言:javascript
复制
# /lib/inflector.rb
module Inflector
  module ParameterizeCs
    # Parameterize a string without making it lowercase
    # by editing Rails' parameterize
    def parameterize_cs(string, sep = '-')
        ....
    end
  end
end

# Actually monkey-patch Inflector
Inflector.include Inflector::ParameterizeCs

但是我得到了这个错误:undefined method parameterize_cs

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2016-02-05 11:53:31

你有没有尝试过,比如添加一个类,这样你就可以调用parameterize_cs方法:

代码语言:javascript
复制
# /lib/inflector.rb
module Inflector
  class ParameterizeCs
    # Parameterize a string without making it lowercase
    # by editing Rails' parameterize
    def parameterize_cs(string, sep = '-')
        ....
    end
  end
end

# Actually monkey-patch Inflector
Inflector.include Inflector::ParameterizeCs
票数 0
EN

Stack Overflow用户

发布于 2016-02-05 12:57:40

首先,确保您已经配置了配置/应用程序.rb文件来加载/lib文件夹中的文件:

代码语言:javascript
复制
config.autoload_paths += %W(#{config.root}/lib)

这将自动加载您的新文件。但是,从您的设置来看,它不会进入ActiveSupport::Inflector,而是进入您定义的普通Inflector模块。

如果您希望在ActiveSupport::Inflector中定义该方法,则必须指定完整路径,之后您应该能够简单地调用该方法。顺便说一句,如果你只有一个方法,module ParameterizeCs对我来说似乎不必要,所以我在这里跳过了。

代码语言:javascript
复制
module ActiveSupport
    module Inflector
        # Parameterize a string without making it lowercase
        # by editing Rails' parameterize
        def parameterize_cs(string, sep = '-')
            ....
        end
    end
end

编辑:

请在您尝试include模块并调用parameterize_cs的地方发布代码。否则,就很难找出问题出在哪里。但我会根据我的猜测提供更多信息。

如果您已经加载了该文件,则该方法已经存在。没有必要像那样再include一次。您可以通过调用ActiveSupport::Inflector.instance_methods来检查它,它将列出ActiveSupport::Inflector中的所有实例方法。您应该能够在那里看到:parameterize_cs

另一件需要检查的事情是,您是否试图从模块本身调用parameterize_cs,比如ActiveSupport::Inflector.parameterize_cs。该方法被定义为实例方法,因此只能从调用了include ActiveSupport::Inflector的类的实例中调用它。下面的代码将ActiveSupport::Inflector模块包含到String中(以确保将parameterize_cs加载到String中),然后从String的实例调用parameterize_cs

代码语言:javascript
复制
String.include ActiveSupport::Inflector
s = "foobar"
s.parameterize_cs("bar")

如果你想直接从ActiveSupport::Inflector.parameterize_cs这样的模块调用parameterize_cs,那么将该方法声明为一个类方法(即def self.parameterize_cs)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35214395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档