Удобочитаемый URL-адрес вызывает проблемы в Ruby on Rails - PullRequest
2 голосов
/ 18 июня 2010

У меня есть базовый CRUD с моделью "Company". Чтобы название компании появилось, я набрал

def to_param
  name.parameterize
end

Затем я получил доступ к http://localhost:3000/companies/american-express, который запускает действие show в контроллере компаний.

Очевидно, что это не работает, потому что метод show выглядит следующим образом:

def show
  @company = Company.find_by_id(params[:id])
end

params[:id] - это american-express. Эта строка нигде не сохраняется.

Нужно ли сохранять короткую строку (т. Е. "American-express") в базе данных при сохранении записи? Или есть какой-нибудь способ получить данные компании без сохранения строки в базе данных?

Ответы [ 5 ]

3 голосов
/ 18 июня 2010

Отправить идентификатор с параметризованным значением;

def to_param
    new_record? ? super : "#{id}-#{name}"
end

А когда вы собираете данные в методе show, вы можете использовать весь параметр;

def show
    @company = Company.find("12-american-express"); // equals to find(12)
end

Существует также плагин permalink_fu, о котором вы можете прочитать больше о здесь .

2 голосов
/ 18 июня 2010

Я думаю friendly_id более пригодно для использования.

0 голосов
/ 18 июня 2010

Я бы также предложил камень friendly_id .Это дает вам гибкость в использовании постоянных слизней постоянных ссылок, также диакритических символов, конвертации в полноценный ASCII и т. Д. В основном это значительно облегчает вашу жизнь, и вы получаете «настоящие» постоянные ссылки (без необходимости to_param и обходного пути id) без особых усилий.

О, и я упоминал, что постоянные ссылки также являются версиями, так что вы можете сделать старые устаревшие постоянные ссылки для перенаправления на текущую?:)

0 голосов
/ 18 июня 2010

Попробуйте плагин permalink_fu, который создает SEO-ориентированные URL в рельсах

http://github.com/technoweenie/permalink_fu

cheers

sameera

0 голосов
/ 18 июня 2010

Я делаю нечто похожее с моделью Category в моем блоге.Если вы можете гарантировать, что единственное преобразование, которое метод parameterize делает для названий вашей компании, - это замена пробелов на тире, то вы можете просто сделать обратное:

def show
  @company = Company.find_by_name(params[:id].gsub(/-/, ' '))
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...