我正在尝试定义一个Rails的parameterize版本,它不会将结果字符串小写。
# 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我想我会这么做:
# /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
有什么想法吗?
发布于 2016-02-05 11:53:31
你有没有尝试过,比如添加一个类,这样你就可以调用parameterize_cs方法:
# /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发布于 2016-02-05 12:57:40
首先,确保您已经配置了配置/应用程序.rb文件来加载/lib文件夹中的文件:
config.autoload_paths += %W(#{config.root}/lib)这将自动加载您的新文件。但是,从您的设置来看,它不会进入ActiveSupport::Inflector,而是进入您定义的普通Inflector模块。
如果您希望在ActiveSupport::Inflector中定义该方法,则必须指定完整路径,之后您应该能够简单地调用该方法。顺便说一句,如果你只有一个方法,module ParameterizeCs对我来说似乎不必要,所以我在这里跳过了。
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。
String.include ActiveSupport::Inflector
s = "foobar"
s.parameterize_cs("bar")如果你想直接从ActiveSupport::Inflector.parameterize_cs这样的模块调用parameterize_cs,那么将该方法声明为一个类方法(即def self.parameterize_cs)。
https://stackoverflow.com/questions/35214395
复制相似问题