为什么根路由不适用于用户#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"
,它会正确执行 UsersController
的 show
操作,但如果您实施了该操作 "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
当您想显示其他用户(例如管理员)的个人资料时,该条件可能会帮助您获取用户的个人资料。
我尝试将此作为我的根路由 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"
,它会正确执行 UsersController
的 show
操作,但如果您实施了该操作 "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
当您想显示其他用户(例如管理员)的个人资料时,该条件可能会帮助您获取用户的个人资料。