为什么根路由不适用于用户#show?

Why root route not working with users#show?

我尝试将此作为我的根路由 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'

感谢您的宝贵时间。

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

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

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

如果您像您提到的那样定义了 root root "users#show",它会正确执行 UsersControllershow 操作,但如果您实施了该操作 "the standard way":

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

这里失败了,因为没有params[:id]。该值是从 url 中获取的。如果您指向 url:

localhost:3000/users/1

params[:id] 的值为“1”。

因为你试图指向 root_path:

localhost:3000

没有参数 :id 绑定,因此:

User.find(params[:id])

抛出异常。

如果你想要"the proper way",修改你的config/routes.rb:

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 方法,并且 returns 正确 User

但是,您必须注意 - 将 "profile" 设置为 root 会导致未登录的用户看到错误页面。

希望对您有所帮助!

更新 - 将一些模板移动到部分

您可以从 app/views/users/show.html.erb 中提取您需要的代码。比方说,它的内容是这样的:

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

你可以把它提取到部分app/views/users/_user_details.html.erb,所以它有内容:

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

请注意,@ 已从此处删除,在您的 app/views/users/show.html.erb,您可以删除所有代码并将其替换为:

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

您的 app/views/pages/home.hmtl.erb 可能会使用相同的方法,例如:

<% if logged_in? %>
  <%= render partial: "user_details", locals: { user: @user } %>
<% end %>

假设,在你的 PagesController 中你有类似的东西:

class PagesController < ApplicationController
  def home
    @user = current_user
  end
end

显示操作正在寻找参数[:id],但在登录期间没有设置id。

尝试从您的 current_user 获取 ID:

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

当您想显示其他用户(例如管理员)的个人资料时,该条件可能会帮助您获取用户的个人资料。