Понимание того, что происходит с : и # в ruby, rails route

В ответе на этот вопрос о маршрутах в Devise: URL-адреса пользователей Devise и Custom Rails это строка кода:

match '/:user' => "users#show", :as => :user_profile

Очевидно, это работает для задающего вопрос, но не для меня. я заканчиваю с

NoMethodError in UsersController#show
undefined method `books' for nil:NilClass

когда я перехожу на localhost:3000/username вместо localhost:3000/user/username. Я предполагаю, что приведенная выше строка match работает неправильно, и этот URL-адрес не относится ни к одному пользователю, согласно моему файлу маршрутов.

Второй URL-адрес перенаправляет меня на страницу show пользователя, но мне не нужен лишний /user в URL-адресе.

Поэтому я пытаюсь выяснить, что именно означают '/:user', :as и :user_profile, потому что я думаю, что предполагается заменить здесь несколько вещей, специфичных для моего приложения. Я думаю, что :as — это какой-то метод с псевдонимом. Я не могу найти ничего в документации Devise о маршруте с именем user_profile. И я не знаю, что имеет в виду '/:user'. Экземпляр объекта User? Атрибут пользователя/уникальный столбец в моей базе данных, который я использую для ссылки на конкретных пользователей? (Я использую постоянную ссылку для определяемых пользователем URL-адресов).


person ThinQtv    schedule 23.09.2013    source источник
comment
Пожалуйста, опубликуйте свой файл route.rb, а также свой UsersController.   -  person PinnyM    schedule 23.09.2013
comment
Проблема в том, что я использовал {match '/:permalink' =› users#show, :as =› :user_profile} вместо {match '/:id' =› users#show, :as =› :user_profile}. Так что, по крайней мере, это работает, но, к сожалению, я не смогу никому объяснить, почему это работает.   -  person ThinQtv    schedule 23.09.2013


Ответы (2)


Маршрут работает на вас. Вот почему вы получаете ошибку from users_controller#show.

В вашем действии show вы должны делать что-то вроде User.where(:id => params[:id]). Но в этом случае атрибут в ваших параметрах называется :user . Итак, чтобы оба маршрута работали без каких-либо изменений в действии show, измените маршрут на

match '/:id' => "users#show", :as => :user_profile
person Santhosh    schedule 23.09.2013
comment
ЭТО ОНО! Глупый я, я использовал {match '/:permalink' =› users#show, :as =› :user_profile}. Не знаю, почему я не попробовал {:id}. - person ThinQtv; 23.09.2013

Документация Devise не будет ссылаться на «user_profile», потому что это настраиваемый маршрут, используемый для решения проблемы, которую задавал задавший вопрос (в связанном вопросе).

match '/:user' => "users#show" означает «сопоставить любой маршрут с одним параметром после /, который не соответствует ранее определенному маршруту, соединить этот маршрут с действием «show» UsersController (передавая единственный параметр как «user»)»

Изменение маршрута с помощью :as => :anything предоставит несколько вспомогательных методов для ссылки на этот маршрут, которые можно использовать в контроллерах, представлениях и почтовых программах (в данном случае anything_path и anything_url).

Что касается того, почему это не сработает для вас, это, вероятно, приведет к проблеме с этой записью в отношении остальных ваших маршрутов или из-за самого действия вашего контроллера. Публикация их может помочь кому-то отследить точную причину...

person PinnyM    schedule 23.09.2013
comment
Спасибо! Я думал, что user_profile был маршрутом, который я должен был составить, в отличие от того, что предоставил Devise, но я не был уверен. - person ThinQtv; 23.09.2013