如何更改 Rails 参数化中的分隔符

Ada*_*344 2 ruby-on-rails

这似乎是一个愚蠢的问题,但我如何parameterize在 Rails 中使用?我看过这个文档:http : //api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize

在我的模型中,我可以开始string.parameterize工作,但我不明白如何使用separator参数。parameterize(string, separator: '')说我不能在 main 上使用参数化,并string.parameterize(separator: '')说不能从 Hash 隐式转换为 String

Seb*_*lma 5

string.parameterize不指定任何字符将为您提供由单词分隔的字符串,删除任何不是字母的字符,并“加入”它们'-'

string = 'Donald E. Knuth'
string.parameterize
# => "donald-e-knuth"
Run Code Online (Sandbox Code Playgroud)

这样指定一个分隔符:

string.parameterize(separator: '*')
# => donald*e*knuth
Run Code Online (Sandbox Code Playgroud)

该方法I18n.transliterate对传递的字符串使用该方法,然后应用破坏性gsub!检查任何非字母字符并应用替换,就像这样做:

# without separator specified
I18n.transliterate(string).gsub!(/[^a-z0-9\-_]+/i, 'separator')
# => Donald-E-Knuth
Run Code Online (Sandbox Code Playgroud)

因此,如果没有指定分隔符,则该方法已将其定义为第三个参数:

def parameterize(string, sep = :unused, separator: '-', preserve_case: false)
  ...
end
Run Code Online (Sandbox Code Playgroud)

请注意,使用首先是方法调用,string然后是parameterize方法调用,这与文档中举例说明的不同。

注意:在 ruby2.3.1和 Rails上测试5.0.2它运行良好, Rails 4.2.54.2.6(如您所说)并4.2.7抛出此错误:

Loading development environment (Rails 4.2.5)
> string  = 'x y z'
# => "x y z" 
> string.parameterize(separator: '*')
TypeError: no implicit conversion of Hash into String
Run Code Online (Sandbox Code Playgroud)

在 Rails < 5 中,它必须用作ActiveSupport::Inflector.parameterize(string, separator)

> @item = Item.first
# => #<Item id: 1, name: "new item" ...> 
> ActiveSupport::Inflector.parameterize(@item.name, '*')
# => "new*item"
Run Code Online (Sandbox Code Playgroud)