В Rails есть отличный метод экземпляра модели под названием to_param
, и это то, что используют пути. По умолчанию id
, но вы можете переопределить его и создать что-то вроде:
class Category < ActiveRecord::Base
def to_param
name
end
end
cat = Category.find_by_name('music')
category_path(cat) # => "/categories/music"
Для получения дополнительной информации обратитесь к документации Rails для to_param .
EDIT:
Когда речь идет об именах категорий, которые не идеальны для URL, у вас есть несколько вариантов. Один из них, как вы говорите, заключается в gsub
пробелах с дефисами и наоборот при поиске записи. Однако более безопасным вариантом будет создание еще одного столбца в таблице категорий с именем name_param
(или аналогичным). Затем вы можете использовать его вместо имени для всего бизнеса, связанного с путями и URL. Используйте инфлектор parameterize
, чтобы создать безопасную для URL строку. Вот как я это сделаю:
class Category < ActiveRecord::Base
after_save :create_name_param
def to_param
name_param
end
private
def create_name_param
self.name_param = name.parameterize
end
end
# Hypothetical
cat = Category.create(:name => 'My. Kewl. Category!!!')
category_path(cat) # => "/categories/my-kewl-category"
# Controller
@category = Category.find_by_name_param(param[:id]) # <Category id: 123, name: 'My. Kewl. Category!!!'>