我在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"}
在这种情况下使用Profile
或CurrentUser
控制器可能是有意义的。它将消除您可能与设计之间的任何路由冲突,而且,从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)