Как реализовать «короткие» вложенные тщеславные URL в рельсах? - PullRequest
6 голосов
/ 04 апреля 2010

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

Возможно ли это?

Ответы [ 3 ]

5 голосов
/ 05 апреля 2010

Для того, чтобы эта работа работала с 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"
2 голосов
/ 04 апреля 2010
1 голос
/ 05 апреля 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) %>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...