Ruby on rails 在Rails中,如何以及在何处定义一个新方法来稍微更改现有Rails方法
我试图定义Rails的一个版本,Ruby on rails 在Rails中,如何以及在何处定义一个新方法来稍微更改现有Rails方法,ruby-on-rails,Ruby On Rails,我试图定义Rails的一个版本,参数化,它不会对结果字符串进行降级 # 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)
参数化
,它不会对结果字符串进行降级
# 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
但是我得到了这个错误:未定义的方法参数化\u cs
有什么想法吗?您是否尝试过,比如添加一个类,以便调用参数化\u 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
您是否尝试过,例如添加一个类以便调用参数化\u 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
首先,请确保已将config/application.rb文件配置为加载/lib文件夹中的文件:
config.autoload_paths += %W(#{config.root}/lib)
这将自动加载您的新文件。但是,从您的设置方式来看,它不会进入ActiveSupport::indoctor
,而是进入您定义的普通indoctor
模块
如果您想在ActiveSupport::Inflector中定义该方法,则必须指定完整路径,之后您应该能够简单地调用该方法。顺便说一句,如果您只有一个方法,module
对我来说似乎没有必要,所以我在这里跳过了它
module ActiveSupport
module Inflector
# Parameterize a string without making it lowercase
# by editing Rails' parameterize
def parameterize_cs(string, sep = '-')
....
end
end
end
编辑:
请将代码张贴在您试图包含
模块的地方,并调用参数化\u cs
。否则,就很难找出可能的错误。但我会根据我的猜测提供更多信息
如果已加载该文件,则该方法已存在。没有必要像那样再次包含它。您可以通过调用ActiveSupport::indoctor.instance\u methods
来检查它,它将列出ActiveSupport::indoctor
中的所有实例方法。您应该能够在那里看到:parameterize_cs
另一件需要检查的事情是,您是否正试图从模块本身调用parameterize\u cs
,如ActiveSupport::Inflector.parameterize\u cs
。该方法被定义为实例方法,因此只能从您调用的类的实例调用它。下面的代码包括ActiveSupport::拐点模块到字符串(以确保参数化\u cs
加载到字符串中),然后从字符串实例调用参数化\u cs
String.include ActiveSupport::Inflector
s = "foobar"
s.parameterize_cs("bar")
如果您想直接从模块调用
parameterize\u cs
,如ActiveSupport::indoctor.parameterize\u cs
,然后将该方法声明为类方法(即def self.parameterize\u cs
)。首先,请确保您已将config/application.rb文件配置为加载/lib文件夹中的文件:
config.autoload_paths += %W(#{config.root}/lib)
这将自动加载您的新文件。但是,从您的设置方式来看,它不会进入ActiveSupport::indoctor
,而是进入您定义的普通indoctor
模块
如果您想在ActiveSupport::Inflector中定义该方法,则必须指定完整路径,之后您应该能够简单地调用该方法。顺便说一句,如果您只有一个方法,module
对我来说似乎没有必要,所以我在这里跳过了它
module ActiveSupport
module Inflector
# Parameterize a string without making it lowercase
# by editing Rails' parameterize
def parameterize_cs(string, sep = '-')
....
end
end
end
编辑:
请将代码张贴在您试图包含
模块的地方,并调用参数化\u cs
。否则,就很难找出可能的错误。但我会根据我的猜测提供更多信息
如果已加载该文件,则该方法已存在。没有必要像那样再次包含它。您可以通过调用ActiveSupport::indoctor.instance\u methods
来检查它,它将列出ActiveSupport::indoctor
中的所有实例方法。您应该能够在那里看到:parameterize_cs
另一件需要检查的事情是,您是否正试图从模块本身调用parameterize\u cs
,如ActiveSupport::Inflector.parameterize\u cs
。该方法被定义为实例方法,因此只能从您调用的类的实例调用它。下面的代码包括ActiveSupport::拐点模块到字符串(以确保参数化\u cs
加载到字符串中),然后从字符串实例调用参数化\u cs
String.include ActiveSupport::Inflector
s = "foobar"
s.parameterize_cs("bar")
如果您想直接从模块调用
parameterize\u cs
,如ActiveSupport::Indoctor.parameterize\u cs
,然后将该方法声明为类方法(即def self.parameterize\u cs
)。您的模块Parameterizes是否缺少结尾?您的模块Parameterizes是否缺少结尾?我这样做了,似乎加载了/lib中的文件,但该函数仍然不可用。这一行应该是什么:ActiveSupport.include-ActiveSupport::influctor
。这就是我得到的错误:NoMethodError(未定义的方法参数化#)app/models/user.rb:56:in normalize_-friendly_-id-config/initializers/friendly_-id_-finder.rb:10:in set_-slug-app/controllers/registrations_-controller.rb:27:in-update_-resource
我编辑了我的答案。如果它仍然不起作用。请发布更多的代码。这可能有效,但在此之前,我有一个不同的问题,可能会简化我的情况。在较新版本的rails上,这似乎是可能的:“John Smith”。参数化(保留大小写:true)#=>“John Smith”
(),但当我在rails 4.2.0的rails控制台上尝试时,我得到了这个错误类型错误:没有将哈希隐式转换为字符串。有什么想法吗?我还将回顾并尝试您提出的解决方案,因为preserve\u case
似乎只适用于Rails 5,它仍处于测试阶段。此外,引发该错误的原因是您正在对哈希而不是字符串调用该方法。我想您是在用户对象本身上调用它,而不是在User.name或类似的地方调用它。我这样做了,似乎加载了/lib中的文件,但函数是s