实际上,您提供的错误消息指出了问题所在。
如果您定义了根,如您提到的root "users#show",它会正确执行UsersController 的show 操作,但如果您以“标准方式”实施该操作:
def show
@user = User.find(params[:id])
end
这里失败了,因为没有params[:id]。该值是从 url 获取的。如果您指向网址:
localhost:3000/users/1
params[:id] 的值为“1”。
因为你试图指向root_path:
localhost:3000
没有参数:id绑定,因此:
User.find(params[:id])
抛出异常。
如果你想要“正确的方式”,修改你的 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 方法,并且它返回正确的 User
但是,您必须注意 - 将“配置文件”设置为 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