【问题标题】:ActionController::UrlGenerationError in Users#show No route matches errorActionController::UrlGenerationError in Users#show 没有路由匹配错误
【发布时间】:2016-01-19 13:58:59
【问题描述】:

我正在创建一个用户控制器来显示用户个人资料页面,但我收到此错误

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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 url ruby-on-rails-3.2


    【解决方案1】:

    在 url 中你应该传递用户的id,你不要那样做。

    您真正想要合并的是friendly_id gem

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

    www.mysite.com/users/1
    

    会变成

    www.mysite.com/users/jack
    

    【讨论】:

      【解决方案2】:

      嗯,这个错误就是这样:

      缺少必需的键:[:id]

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

      简而言之,这告诉您的是,您正在尝试传递已登录用户的 username,但在这种情况下,已登录用户没有 username

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

      【讨论】:

        【解决方案3】:

        在你的路由文件中添加

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

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

        无需安装其他 gem。

        贾斯汀

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-26
          • 1970-01-01
          • 2019-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多