Ruby on rails ActionController::Users中的UrlGenerationError#显示无路由匹配错误

Ruby on rails ActionController::Users中的UrlGenerationError#显示无路由匹配错误,ruby-on-rails,ruby,ruby-on-rails-4,url,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 4,Url,Ruby On Rails 3.2,我正在创建一个用户控制器以显示用户配置文件页面,但我收到了此错误 ActionController::UrlGenerationError in Users#show No route matches {:action=>"show", :controller=>"users", :id=>nil} missing required keys: [:id] error 我试图为每个用户添加一个配置文件页面,因此当用户例如转到 www.mysite.com/users/jack

我正在创建一个用户控制器以显示用户配置文件页面,但我收到了此错误

ActionController::UrlGenerationError in Users#show
No route matches {:action=>"show", :controller=>"users", :id=>nil}
missing required keys: [:id] error
我试图为每个用户添加一个配置文件页面,因此当用户例如转到

www.mysite.com/users/jack
它将显示他们的个人资料页面

这是我的代码:

layouts/_navbar.html.erb

<nav class="navbar navbar-default">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>

      </button>
      <a class="navbar-brand" href="/">Skillbook</a>




    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">



      </ul>

      <ul class="nav navbar-nav navbar-right">
        <% if user_signed_in? %>
        <td><%= link_to "Profile", user_path(current_user.username) %></td>
        <td><%= gravatar_tag current_user.email, size: 20 %><%= current_user.username %></td>
        <li><%= link_to  "Edit user", edit_user_registration_path %></li>
        <li><%= link_to  "Log out", destroy_user_session_path ,method: :delete %></li>
        <%else%>
        <li><%= link_to  "Log in", new_user_session_path %></li>
        <li><%= link_to  " Sign up", new_user_registration_path%></li>

      <%end%>



      </ul>




      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>
class UsersController < ApplicationController
before_action :set_user, only: [:show]



private
  def set_user
    @user = User.find_by(username: params[:id])
  end

end
Rails.application.routes.draw do


  get 'pages/home'

  devise_for :users

   root 'pages#home'

resources :users, only: [:show, :index]


end

在url中,您应该传递用户的
id
,但您不这样做

你真正想合并的是

设置后,您将能够实际将用户id显示为名称(或您想要的任何其他属性/属性组合):

将成为

www.mysite.com/users/jack

在url中,您应该传递用户的
id
,但您不这样做

你真正想合并的是

设置后,您将能够实际将用户id显示为名称(或您想要的任何其他属性/属性组合):

将成为

www.mysite.com/users/jack

这个错误就是这样的:

缺少必需的密钥:[:id]

其中,根据您的设置,是当前登录用户的
用户名

简而言之,这告诉您您正试图传入已登录用户的
用户名
,但在本例中,已登录的用户没有
用户名


要解决此问题,请确保登录用户(以及所有其他用户)的
用户名
不是
nil

那么,此错误就是:

缺少必需的密钥:[:id]

其中,根据您的设置,是当前登录用户的
用户名

简而言之,这告诉您您正试图传入已登录用户的
用户名
,但在本例中,已登录的用户没有
用户名


若要解决此问题,请确保已登录用户(以及所有其他用户)的
用户名
在路由文件add中不是
nil

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

最后一部分
as:
是命名路线的地方。这将为用户名为“jack”的用户提供路由/users/jack。同样,如果你想完全摆脱用户,你可以把
放在:'/:username'

不需要安装另一个gem


Justin

在路由文件中添加

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

最后一部分
as:
是命名路线的地方。这将为用户名为“jack”的用户提供路由/users/jack。同样,如果你想完全摆脱用户,你可以把
放在:'/:username'

不需要安装另一个gem

贾斯汀