Как реализовать короткие вложенные URL-адреса тщеславия в рельсах?

Я понимаю, как создать личный URL-адрес в Rails, чтобы преобразовать 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.

Это возможно?


person UnSandpiper    schedule 04.04.2010    source источник
comment
Маршрутизация ресурсов, вложенная маршрутизация и неглубокая маршрутизация будут иметь имя ресурса в пути, поэтому, если вы хотите, чтобы в пути были только идентификаторы или какое-то имя форума, вам нужно будет выполнить обычную маршрутизацию, возможно, с ограниченными параметрами. .   -  person Corey    schedule 05.04.2010


Ответы (3)


Чтобы это работало "хорошо" с помощниками 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

Взгляните на руководство по маршрутизации в Rails извне внутрь.

person John Topley    schedule 04.04.2010
comment
это то, что я читал, но я не могу понять из доступных примеров и описаний, что должно привести к результатам, которые я ищу. Это мелкое гнездование? :имеет много? Или использовать map.connect и подстановочные знаки (которые, по мнению некоторых людей, вам не следует использовать)... здесь вы ищете подсказку в правильном направлении. - person UnSandpiper; 04.04.2010

может попробовать что-то вроде

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

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

person Hock    schedule 05.04.2010