Rails单一资源似乎不会产生"user_path"



我在3.1.0中有以下路由。rc5应用

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

这里的想法是,我使用设计会话管理,'users'资源只是为了生成索引操作的users_path,然后大多数其他用户操作将通过路由访问,如

  • GET user_path ->显示动作
  • GET new_user_path ->新动作
  • POST user_path ->创建动作

user_path路由助手似乎没有生成,虽然,每当我尝试在视图中使用它时,当rails试图渲染它时,我得到一个奇怪的错误。

例如,在/user/new页面上,我有以下

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

当rails尝试渲染页面时,我得到

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'

这是怎么回事?

Edit下面是rake路由的内容。它是相当大的,所以我把它削减到只有用户相关的路由。

       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"}

在这种情况下使用ProfileCurrentUser控制器可能是有意义的。它将消除您可能与设计之间的任何路由冲突,而且,从RESTful的角度来看,它是有意义的,因为您将当前用户视为一个独特的资源。

devise_for :user
resources :users, :only => :index
resource :profile

我在设计时也遇到过类似的问题。将as: :user添加到单一路线中对我有帮助。

get '/users/:id', to: 'users#show', as: :user

然后我可以将其命名为user_path或传递参数user_path(current_user)

相关内容

最新更新