Имя пользователя Rails в URL


Пытаюсь использовать имя пользователя в моих маршрутах rails.

Маршруты, которые работают:

resources :users, only: [:show, :create, :update, :destroy]
get "/:username" => "users#show", as: :user
get "/:username/account" => "users#account", as: :user_account
get "/:username/interests", to: "users#interests", as: :user_interests
get "/:username/offers" => "users#offers", as: :user_offers
get "/:username/trades" => "users#trades", as: :user_trades

Но теперь такой маршрут:

get "/signup" 

Сопоставляется с правилом /:username

Я знаю, что могу изменить порядок своих маршрутов так, чтобы /signup появлялся раньше, но это кажется немного банальным.

Есть ли какие-нибудь способы, чтобы я мог переписать это? Или это единственный метод проверки зарезервированных имен пользователей?

Спасибо

EDIT

Я закончил тем, что добавил проверку к пользовательская модель с зарезервированными словами. Пространство имен-хорошая идея, но я не хочу загрязнять свои URL-адреса.

Для записи, пространство имен Twitter не-имена пользователей, как это: twitter.com/i/discover (заходит в раздел Twitter discover) twitter.com/discover (заходит в профиль @discover)

Pinterest зарезервировал имена, такие как "поиск", насколько я могу судить

Я следовал подходу Pinterest с кодом:

Проверка:

validate :reserved_username

private

    def reserved_username
      reserved_usernames = %w[index show create destroy edit update signup interests interest item items search offers offer community about terms privacy admin map authentication]
      errors.add(:reserved_username, "username is reserved for the app") if reserved_usernames.include?(username)
    end
1   4   2013-05-28 19:46:15

1 ответ:

Маршруты имеют приоритет в порядке определения, с более ранним переопределением позже. Если вы хотите, чтобы ваш /signup путь работал, он должен быть определен до /:username. Это не халтура, это просто так работает.

Можно исключить определенные совпадения для :username, но это замедляет вашу маршрутизацию, если список становится длинным, или вам придется переписать его как регулярное выражение, что, вероятно, является определением hacky здесь.

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

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