Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中,如何以及在何处定义一个新方法来稍微更改现有Rails方法_Ruby On Rails - Fatal编程技术网

Ruby on 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)

我试图定义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)
  # 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