Как мне сделать так, чтобы формат моих URL был именем пользователя / controller /: id в Rails 3.1? - PullRequest
1 голос
/ 04 сентября 2011

Я хочу, чтобы это было похоже на то, как Twitter обрабатывает URL-адреса своих твитов.

Например, сейчас мой URL выглядит так: mydomain.com/feedbacks/1/, где feedbacks - это имя контроллера.

Я хочу, чтобы он выглядел следующим образом: mydomain.com/username/feedbacks/1/, который похож на Twitter: twitter.com/username/status/:id/.

Мой routes.rb выглядит следующим образом:

  resources :users do
      resources :feedbacks
  end

КогдаУ меня это так, он дает мне URL-адреса как mydomain.com/users/1/feedbacks, но я хочу фактическое имя пользователя в URL-адресе.

Как мне это получить?

Спасибо.

Изменить 1: Если вы добавляете другой ответ на этот вопрос, пожалуйста, убедитесь, что он направляет мои комментарии / вопросы к ответу, который уже дан.В противном случае это будет излишним.

Ответы [ 2 ]

5 голосов
/ 04 сентября 2011
scope ":username" do
  resources :feedbacks
end

Из документов :

Это предоставит вам URL, такие как / bob / posts / 1, и позволит вы должны ссылаться на часть имени пользователя пути как params [: имя пользователя] в контроллеры, помощники и представления.


UPDATE:

Я проверил и подтвердил точность ответа Паозака . Я поясню это немного.

Предположим, у вас есть @feedback объект с id, равным 12, а связанный пользователь имеет username, равный foouser. Если вы хотите сгенерировать URL-адрес страницы редактирования для этого @feedback объекта, вы можете сделать следующее:

edit_feedback_url(:username => @feedback.user.username, :id => @feedback)

Вывод будет "/foouser/feedbacks/12/edit".

# A URL to the show action could be generated like so:
feedback_url(:username => feedback.user.username, :id => feedback)
#=> "/foouser/feedbacks/12"
# New
new_feedback_url(:username => current_user.username)
#=> "/foouser/feedbacks/new"

Кроме того, как отметил Натанвда в комментариях, вы можете передавать упорядоченные аргументы , которые будут сопоставлены с соответствующим динамическим сегментом. В этом случае имя пользователя должно быть передано первым, а идентификатор обратной связи должен быть передан вторым, т. Е .:

.
edit_feedback_url(@feedback.user.username, @feedback)

Также, если вам нужна помощь в обработке параметров из контроллера, я предлагаю создать новый вопрос, специфичный для этого.

2 голосов
/ 08 сентября 2011

Как только вы определили область видимости, как говорит dwhalen, вы можете сгенерировать URL следующим образом:

feedbacks_url(:username => 'foo')

и получить

http://www.example.com/foo/feedbacks

или

edit_feedback_url(:username => 'foo', :id => 1)

и получите

http://www.example.com/foo/feedbacks/1/edit
...