2016-02-05 21 views
1

我試圖定義Rails'parameterize的一個版本,它不會導致生成的字符串不合適。在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) 
    # 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

任何想法?

+0

是不是你** **結束**你的**模塊Para​​meterizeCs **? – Lymuel

回答

0

您是否嘗試過,比如增加一類,所以你可以調用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 
0

好了,先確保你已經配置你的config/application.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") 

如果要直接從模塊調用parameterize_csActiveSupport::Inflector.parameterize_cs,則聲明該方法作爲一類方法(即def self.parameterize_cs)。

+0

我這樣做,似乎在/ lib加載文件,但該功能仍然不可用。這一行應該是什麼:'ActiveSupport.include ActiveSupport :: Inflector'。這是我得到的錯誤:'NoMethodError(undefined method parameter_cs for#): 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' – Catalin

+0

我編輯了我的答案。如果它仍然沒有工作。請張貼更多你的代碼。 – Harfangk

+0

這可能會起作用,但在那之前我有一個不同的問題,可能會簡化我的情況。看起來像新版本的rails這是可能的:'「John Smith」.parameterize(preserve_case:true)#=>「John-Smith」(http://edgeguides.rubyonrails.org/active_support_core_extensions.html),但是當我試圖在軌道上的軌道控制檯4.2.0我得到這個錯誤'TypeError:沒有隱式轉換哈希到字符串'。有任何想法嗎 ?我還將複習並試用您提出的解決方案 – Catalin

相關問題