Как реализовать “короткие” вложенные URL тщеславия в направляющих?

Я понимаю, как создать 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.

Действительно ли это возможно?

6
задан UnSandpiper 4 April 2010 в 18:37
поделиться

3 ответа

Взгляните на Rails Routing from the Outside In .

2
ответ дан 16 December 2019 в 21:37
поделиться

может быть, попробуйте что-то вроде

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) %>

Я надеюсь, что это поможет

1
ответ дан 16 December 2019 в 21:37
поделиться

Чтобы эта работа "хорошо" работала с помощниками 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"
5
ответ дан 16 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: