Чтобы это работало "хорошо" с помощниками URL Rails, вы должны переопределить to_param
в своей модели:
def to_param
permalink
end
Где permalink
генерируется, возможно, before_save
before_save :set_permalink
def set_permalink
self.permalink = title.parameterize
end
Причина, по которой вы создаете постоянную ссылку, заключается в том, что в конечном итоге, возможно, потенциально у вас будет заголовок, который не подходит для URL. Вот тут-то и появляется parameterize
.
Теперь, что касается поиска этих сообщений на основе того, что такое permalink
, вы можете пойти либо по легкому, либо по сложному пути.
Легкий маршрут
Определите to_param
немного иначе:
def to_param
id.to_s + permalink
end
Продолжайте использовать Forum.find(params[:id])
, где params[:id]
будет что-то вроде 1-my-awesome-forum
. Почему это все еще работает? Что ж, Rails вызовет to_i
для аргумента, переданного в find
, а вызов to_i
для этой строки вернет просто 1
.
Сложный маршрут
Оставьте to_param
прежним. Прибегайте к использованию find_by_permalink
в ваших контроллерах, используя params[:id]
, который передается в виде маршрутов:
Model.find_by_permalink(params[:id])
Теперь самое интересное
Теперь вы хотите удалить ресурс из URL-адреса. Что ж, это сизифовский подход. Конечно, вы могли отказаться от использования помощников маршрутизации, предоставляемых Ruby on Rails, таких как map.resources
, и определить их с помощью map.connect
, но стоит ли это такой большой выгоды? Какие «особые сверхспособности» он вам дает? Боюсь, нет.
Но все же, если вы хотите это сделать, вот отличное место для начала:
get ':forum_id/:board_id/:topic_id', :to => "topics#show", :as => "forum_board_topic"
person
Ryan Bigg
schedule
05.04.2010