age*_*eto 0 ruby-on-rails devise
我是第一次在应用程序中使用Devise,我遇到了一个我无法理解的奇怪问题:
我用Devise创建了我的用户模型,并设置了所有注册,用户注册等,一切正常.在我的应用程序标题中,我有我的导航菜单(当前为空)和部分登录,注销等:
_header.html.erb
<div class='topbar'>
<div class='container'>
<%= link_to 'My app', root_path, :class => 'brand' %>
<div class='nav'>
</div>
<%= render 'layouts/user_options' %>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
_user_options.html.erb
<ul class='user-options'>
<% if user_signed_in? %>
<li><%= link_to "Signed in as #{current_user.username}", '#' %></li>
<li><%= link_to "Sign out", destroy_user_session_path, :method => :delete %></li>
<% else %>
<li><%= link_to "Sign up", new_user_registration_path %></li>
<li><%= link_to "Sign in", new_user_session_path %></li>
<% end %>
</ul>
Run Code Online (Sandbox Code Playgroud)
现在我添加导航菜单的第一个链接,如果我使用:
<%= link_to 'Tasks', '/tasks/index' %>
Run Code Online (Sandbox Code Playgroud)
一切都好.但如果我使用:
<%= link_to 'Tasks', :controller => 'tasks', :action => 'index' %>
Run Code Online (Sandbox Code Playgroud)
当我点击任何Devise链接时,例如"登录",我明白了 'No route matches {:controller=>"devise/tasks"}'
根据评论请求,这里是rake routes:
任务的输出:TOP => routes => environment(通过使用--trace运行任务查看完整跟踪)MacBook-Pro-de-o:dearsherpa Oscar $ bundle exec rake routes
tasks_index GET /tasks/index(.:format) {:controller=>"tasks", :action=>"index"}
tasks_show GET /tasks/show(.:format) {:controller=>"tasks", :action=>"show"}
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"}
cancel_user_registration GET /users/cancel(.:format) {:action=>"cancel", :controller=>"devise/registrations"}
user_registration POST /users(.:format) {:action=>"create", :controller=>"devise/registrations"}
new_user_registration GET /users/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"}
edit_user_registration GET /users/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"}
PUT /users(.:format) {:action=>"update", :controller=>"devise/registrations"}
DELETE /users(.:format) {:action=>"destroy", :controller=>"devise/registrations"}
root / {:controller=>"pages", :action=>"home"
Run Code Online (Sandbox Code Playgroud)
这是routes.rb:
get "tasks/index"
get "tasks/show"
devise_for :users
root :to => 'pages#home'
Run Code Online (Sandbox Code Playgroud)
为什么是这样??我做错了什么?
编辑2:顺便说一句,我忘了提及,Task belongs_to User用户模型已经由设计生成.这可能是造成这种情况的原因.没有/ user/id/tasks /我不能访问/ tasks/index吗?
编辑:更奇怪的东西,我尝试使用资源:我的路线文件中的任务,而不是该控制器的"获取"路线,现在当我点击<%= link_to 'Tasks', :controller => 'tasks', :action => 'index' %>它时,我带到了show动作.显然,我的路线确实出了问题.
问题在于'devise'命名空间.当您以这种方式使用链接创建时:
<%= link_to 'Tasks', :controller => 'tasks', :action => 'index' %>
Run Code Online (Sandbox Code Playgroud)
然后路由从当前命名空间生成,当您单击任何设备链接时,该命名空间为"设计".
要避免此行为,您可以这样使用路由:
<%= link_to 'Tasks', :controller => '/tasks', :action => 'index' %>
Run Code Online (Sandbox Code Playgroud)
或者使用helper,它们在这种情况下正常工作(如果在routes.rb中为'get"tasks/index",则为tasks_index_path,如果是资源,则为tasks_path:tasks)
| 归档时间: |
|
| 查看次数: |
1070 次 |
| 最近记录: |