Комбинирование проекта с ресурсами: пользователи в Rails
Я пытаюсь объединить Devise с ресурсом пользователя RESTful, используя следующий код в файле routes.rb:
resources :users, :only => [:index, :show]
devise_for :users
Однако URL-адрес localhost: 3000/users/sign_up не попадает на страницу регистрации разработки, скорее это приводит к ошибке "Не удалось найти пользователя с ID = sign_up", поэтому он считает, что URL-адрес указывает на шоу действие пользовательского контроллера.
Я обнаружил, что замена порядка строк приводит к предполагаемому поведению:
devise_for :users
resources :users, :only => [:index, :show]
Теперь, когда вы переходите на localhost: 3000/users/sign_up, вы действительно получаете страницу регистрации и переходите к localhost: 3000/users/1 попадает в действие show user-контроллера, как предполагалось.
Мой вопрос в следующем: меняет порядок кода, как это, правильный способ заставить работать вместе с ресурсом пользователей? Или что-то глубже идет не так? Я подозреваю, что просто замена этих двух строк кода не может быть решением!
Ответы
Ответ 1
Мой совет в этих ситуациях - проверить с помощью rake routes
В маршрутах порядок, в котором определены маршруты, имеет значение, поскольку предыдущие маршруты имеют приоритет.
Итак, в вашем случае resources :users, :only => [:index, :show]
создан маршрут restfull /users/:id(.:format)
, который указывает на {:action=>"show", :controller=>"users"}
и когда вы пошли в Devise, зарегистрируйте url /users/sign-up
, который считается "зарегистрированным" пользователем :id
пользователя и, естественно, не может его найти.
Теперь, если вы сначала настроите настройку маршрутизации, разработайте маршруты с приоритетом над чем-либо, указанным позже, и получите ожидаемое поведение.
Ответ 2
Да, это правильный способ сделать это (см. https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface)
Ответ 3
В ссылке, написанной David Sulc, показано, что вы должны написать префикс device_for или ресурсы
Пример:
devise_for :users, :path_prefix => 'my'
resources :users
Или ваши пользователи
devise_for :users
scope "/admin" do
resources :users
end
Оба работают хорошо для меня