Я понимаю, как создать URL тщеславия в направляющих для перевода http://mysite.com/forum/1
в http://mysite.com/some-forum-name
Но я хотел бы взять его шаг вперед и получить следующую работу (если это возможно вообще):
Вместо: http://mysite.com/forum/1/board/99/thread/321
Я хотел бы в первом шаге добраться до чего-то вроде этого: http://mysite.com/1/99/321
и в конечном счете имейте его как http://mysite.com/some-forum-name/some-board-name/this-is-the-thread-subject
.
Действительно ли это возможно?
может быть, попробуйте что-то вроде
map.my_thread ':forum_id/:board_od/:thread_id.:format', :controller => 'threads', :action => 'show'
А затем в вашем контроллере есть
@forum = Forum.find(params[:forum_id])
@board = @forum.find(params[:board_id])
@thread = @board.find(params[:thread_id])
Обратите внимание, что у вас может быть что угодно model_id (имя в данном случае)
На ваш взгляд, вы можете использовать
<%= link_to my_thread_path(@forum, @board, @thread) %>
Я надеюсь, что это поможет
Чтобы эта работа "хорошо" работала с помощниками URL-адресов Rails, вы должны переопределить to_param
в своей модели:
def to_param
permalink
end
Где постоянная ссылка
создается, возможно, с помощью before_save
before_save :set_permalink
def set_permalink
self.permalink = title.parameterize
end
Причина, по которой вы создаете постоянную ссылку, состоит в том, что, в конечном итоге, возможно, потенциально у вас будет заголовок, который не является дружественным к URL. Вот где приходит на помощь parameterize
.
Теперь, что касается поиска этих сообщений на основе постоянной постоянной ссылки
, вы можете выбрать простой или сложный путь.
Простой маршрут
Определите 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"