ActionController::UrlGenerationError in Users#show No route matches 错误
ActionController::UrlGenerationError in Users#show No route matches error
我正在创建一个用户控制器来显示用户个人资料页面,但我收到此错误
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>
users_controller.rb
class UsersController < ApplicationController
before_action :set_user, only: [:show]
private
def set_user
@user = User.find_by(username: params[:id])
end
end
routes.rb
Rails.application.routes.draw do
get 'pages/home'
devise_for :users
root 'pages#home'
resources :users, only: [:show, :index]
end
在 url 中,您应该传递一个 id
用户,但您没有这样做。
您真正想要合并的是friendly_id gem。
通过设置,您将能够实际将用户 ID 显示为名称(或您想要的任何其他 attribute/combination 属性):
www.mysite.com/users/1
会变成
www.mysite.com/users/jack
好吧,这个错误就是这样:
missing required keys: [:id]
其中,根据您的设置,当前 signed-in 用户的 username
。
简而言之,这告诉你的是,你正试图传递 signed-in 用户的 username
,但对于这种情况,登录的用户没有username
.
要解决此问题,请确保 signed-in 用户(以及所有其他用户)的 username
不是 nil
在你的路由文件中添加
get '/users/:id', to: 'users#show', as: '/users/:username'
最后一部分 as:
是您命名路线的地方。这将为用户名 'jack' 的用户提供路由 /users/jack。同样,如果你想完全摆脱用户,你可以输入 as: '/:username'
无需再安装 gem。
贾斯汀
我正在创建一个用户控制器来显示用户个人资料页面,但我收到此错误
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>
users_controller.rb
class UsersController < ApplicationController
before_action :set_user, only: [:show]
private
def set_user
@user = User.find_by(username: params[:id])
end
end
routes.rb
Rails.application.routes.draw do
get 'pages/home'
devise_for :users
root 'pages#home'
resources :users, only: [:show, :index]
end
在 url 中,您应该传递一个 id
用户,但您没有这样做。
您真正想要合并的是friendly_id gem。
通过设置,您将能够实际将用户 ID 显示为名称(或您想要的任何其他 attribute/combination 属性):
www.mysite.com/users/1
会变成
www.mysite.com/users/jack
好吧,这个错误就是这样:
missing required keys: [:id]
其中,根据您的设置,当前 signed-in 用户的 username
。
简而言之,这告诉你的是,你正试图传递 signed-in 用户的 username
,但对于这种情况,登录的用户没有username
.
要解决此问题,请确保 signed-in 用户(以及所有其他用户)的 username
不是 nil
在你的路由文件中添加
get '/users/:id', to: 'users#show', as: '/users/:username'
最后一部分 as:
是您命名路线的地方。这将为用户名 'jack' 的用户提供路由 /users/jack。同样,如果你想完全摆脱用户,你可以输入 as: '/:username'
无需再安装 gem。
贾斯汀