为什么root route不能与用户#show合作?

时间:2015-03-28 18:18:35

标签: ruby-on-rails ruby routes root

我尝试将此作为我的根路由root 'users#show',以便用户在登录时被带到他的个人资料中,但我遇到了这个错误:

ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User with 'id'= 
@user = User.find(params[:id])

当我使用个人资料作为自己的标签时,<li><%= link_to "Profile", current_user %></li>这有效,但我无法放root 'current_user'或我收到此错误:

ArgumentError
Missing :action key on routes definition, please check your routes.
root 'current_user'

感谢您的时间。

3 个答案:

答案 0 :(得分:2)

如果您需要将其重定向到show操作并显示current user的详细信息,请将current_user设置为@user

def show
  @user = params[:id].nil? ? current_user : User.find(params[:id])
end

答案 1 :(得分:1)

实际上,您提供的错误消息指出了问题。

如果您已根据自己提及的root "users#show"定义了root,则会正确执行show的{​​{1}}操作,但如果您已执行该操作并且#34;标准方式&#34;:

UsersController

它在这里失败了,因为没有def show @user = User.find(params[:id]) end 。该值是从url获取的。如果您指向网址:

params[:id]

localhost:3000/users/1 有值&#34; 1&#34;。

因为您试图指向params[:id]

root_path

没有绑定localhost:3000 ,因此:

:id

抛出异常。

如果您想以正确的方式使用#34;,请修改您的 config / routes.rb

User.find(params[:id])

并将您的root "users#profile" get "profile" => "users#profile"

包含在内
UserController

假设您已实施class UserController < ApplicationController # ... def profile @user = current_user # or any other logic relevant to fetching currently logged in User end end 方法,并返回正确的current_user

但是,你必须要注意 - 设置&#34;个人资料&#34;因为User会导致未登录的用户看到错误页面。

希望有所帮助!

更新 - 将部分模板移至部分

您可以从 app / views / users / show.html.erb 中提取所需的代码。我们可以说,它的内容类似于:

root

您可以将其解压缩到部分 app / views / users / _user_details.html.erb ,因此它包含以下内容:

<h3><%= @user.name %></h3>
<small><%= @user.bio %></small>

请注意,<h3><%= user.name %></h3> <small><%= user.bio %></small> 已从此处移除,在 app / views / users / show.html.erb 中,您可以全部删除代码替换为:

@

您可以在 app / views / pages / home.hmtl.erb 中使用相同内容,例如:

<%= render partial: "user_details", locals: { user: @user } %>

假设您的<% if logged_in? %> <%= render partial: "user_details", locals: { user: @user } %> <% end %> 中有类似的内容:

PagesController

答案 2 :(得分:0)

show action正在寻找params [:id],但在登录期间没有设置id。

尝试从current_user获取id:

def show
  params[:id].nil? ? @user = current_user : @user = User.find(params[:id])
end

如果您希望以管理员身份显示其他用户的个人资料,则该条件可能会帮助您获取用户的个人资料。