У рельсов есть противоположность "гуманизации" для строк?
В Rails добавлен метод humanize()
для строк, который работает следующим образом (из Rails RDoc):
"employee_salary".humanize # => "Employee salary"
"author_id".humanize # => "Author"
Я хочу пойти другим путем. У меня "симпатичный" ввод от пользователя, которого я хочу "де-гуманизировать" для записи в атрибут модели:
"Employee salary" # => employee_salary
"Some Title: Sub-title" # => some_title_sub_title
Рельсы включают какую-либо помощь для этого?
Обновить
Тем временем я добавил следующее в app/controllers/application_controller.rb:
class String
def dehumanize
self.downcase.squish.gsub( /\s/, '_' )
end
end
Есть ли лучшее место, чтобы поставить его?
Решение
Спасибо, ФД, за ссылку. Я реализовал решение, рекомендованное там. В моем config/initializers/инфекции .rb я добавил следующее в конце:
module ActiveSupport::Inflector
# does the opposite of humanize ... mostly.
# Basically does a space-substituting .underscore
def dehumanize(the_string)
result = the_string.to_s.dup
result.downcase.gsub(/ +/,'_')
end
end
class String
def dehumanize
ActiveSupport::Inflector.dehumanize(self)
end
end
Ответы
Ответ 1
string.parameterize.underscore
даст вам тот же результат
"Employee salary".parameterize.underscore # => employee_salary
"Some Title: Sub-title".parameterize.underscore # => some_title_sub_title
или вы также можете использовать более краткий (спасибо @danielricecodes).
- Rails <5
Employee salary".parameterize("_") # => employee_salary
- Rails> 5
Employee salary".parameterize(separator: "_") # => employee_salary
Ответ 2
В API Rail нет такого метода. Тем не менее, я нашел это сообщение в блоге, которое предлагает (частичное) решение: http://rubyglasses.blogspot.com/2009/04/dehumanizing-rails.html
Ответ 3
В http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html у вас есть некоторые методы, используемые для префиксации и удаления строк.