设计与非设计模型混合的链接/路线

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动作.显然,我的路线确实出了问题.

alo*_*ony 6

问题在于'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)