Разбиране какво се случва с : и # в ruby, rails routes

В отговора на този въпрос относно маршрутите в 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'. Екземпляр на потребителския обект? Потребителски атрибут/уникална колона в моята база данни, която използвам за препратка към конкретни потребители? (Използвам постоянна връзка за дефинираните от потребителя URL адреси).


person ThinQtv    schedule 23.09.2013    source източник
comment
Моля, публикувайте вашия файл routes.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.

Във вашето шоу действие трябва да правите нещо като User.where(:id => params[:id]). Но в този случай атрибутът във вашите параметри се нарича :user. Така че, за да накарате и двата маршрута да работят, без никаква промяна в действието на шоуто, променете маршрута на

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" означава „съвпадение на всеки маршрут с един параметър след /, който не съответства на предварително дефиниран маршрут, сдвояване на този маршрут с действието „показване“ на UsersController (преминаване по параметъра singe като „потребител“)“

Модифицирането на маршрут с помощта на :as => :anything ще осигури няколко помощни метода за препратка към този маршрут, които могат да се използват в контролери, изгледи и програми за изпращане на съобщения (в този случай anything_path и anything_url).

Що се отнася до причината, поради която това няма да работи за вас, това вероятно се дължи на проблем с този запис по отношение на останалите ви маршрути или поради самото действие на вашия контролер. Публикуването им може да помогне на някой да открие точната причина...

person PinnyM    schedule 23.09.2013
comment
Благодаря! Мислех, че user_profile е маршрут, който трябваше да измисля, за разлика от нещо, предоставено от Devise, но не бях сигурен. - person ThinQtv; 23.09.2013