Единственный ресурс Rails, похоже, не генерирует 'user_path' - PullRequest
0 голосов
/ 22 августа 2011

У меня есть следующие маршруты в моем приложении 3.1.0.rc5

# config/routes.rb
devise_for :users
resources :users, only: :index
resource :user

Идея здесь заключается в том, что я использую devise для управления сеансом, ресурс 'users' только для генерации users_pathдействие index, а затем большинство других действий пользователя будут доступны по таким маршрутам, как

  • GET user_path -> show action
  • GET new_user_path -> new action
  • POST user_path -> создать действие

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

Например, на странице /user/new у меня есть следующее

<%= form_for @user, :url => user_path do |f| %>
  # omitted form elements
<% end %>

Когда рельсы пытаются отобразить страницу, я получаю

ActionView::Template::Error (No route matches {:action=>"destroy", :controller=>"users"}):
    7: </div>
    8: 
    9: <div class="content_middle">
    10:   <%= form_for @user, :url => user_path do |f| %>
    11:   <fieldset>
    12:     <%= render partial: "form_errors" %>
    13: 
  app/views/users/new.html.erb:10:in `_app_views_users_new_html_erb___1548382046039026466_2191201580'

Что с этим!?

Редактировать Вот содержание рейк-маршрутов.Он довольно массивный, поэтому я сократил его только до пользовательских маршрутов.

       new_user_session GET    /users/sign_in(.:format)                     {:action=>"new", :controller=>"devise/sessions"}
           user_session POST   /users/sign_in(.:format)                     {:action=>"create", :controller=>"devise/sessions"}
   destroy_user_session DELETE /users/sign_out(.:format)                    {:action=>"destroy", :controller=>"devise/sessions"}
          user_password POST   /users/password(.:format)                    {:action=>"create", :controller=>"devise/passwords"}
      new_user_password GET    /users/password/new(.:format)                {:action=>"new", :controller=>"devise/passwords"}
     edit_user_password GET    /users/password/edit(.:format)               {:action=>"edit", :controller=>"devise/passwords"}
                        PUT    /users/password(.:format)                    {:action=>"update", :controller=>"devise/passwords"}
                  users GET    /users(.:format)                             {:action=>"index", :controller=>"users"}
                        POST   /users(.:format)                             {:action=>"create", :controller=>"users"}
                   user DELETE /users/:id(.:format)                         {:action=>"destroy", :controller=>"users"}
                        POST   /user(.:format)                              {:action=>"create", :controller=>"users"}
               new_user GET    /user/new(.:format)                          {:action=>"new", :controller=>"users"}
              edit_user GET    /user/edit(.:format)                         {:action=>"edit", :controller=>"users"}
                        GET    /user(.:format)                              {:action=>"show", :controller=>"users"}
                        PUT    /user(.:format)                              {:action=>"update", :controller=>"users"}

1 Ответ

1 голос
/ 25 августа 2011

В этой ситуации может иметь смысл иметь контроллер Profile или CurrentUser. Это позволит устранить любые конфликты маршрутизации, которые могут возникнуть у вас с Devise, а также имеет смысл с точки зрения RESTful, поскольку вы рассматриваете текущего пользователя как отдельный ресурс.

devise_for :user
resources :users, :only => :index
resource :profile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...