Для того, чтобы эта работа работала с 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"