我想将 example.com/users/$ID/edit 隐藏或屏蔽为 example.com/profile/edit 。
配置/ routes.rb中
resources :users
应用程序/控制器/ users_controller.rb
def edit
@user = User.find(params[:id])
end
我尝试添加路线
match '/profile/edit' => 'users#edit', :as => :edit_profile
但是,当我访问 example.com/profile/edit 时,编辑方法会抱怨无法找到用户的ID。
我可以通过浏览器屏蔽ID吗?
答案 0 :(得分:2)
如果您尝试编辑当前用户的个人资料,可以在编辑操作中使用以下内容:
def edit
@user = User.find_by_id( params[:id] ) || current_user
end
如果找不到用户,这将首先尝试通过返回nil的id参数查找用户,如果返回值为nil,则会将@user
设置为{{1的返回值帮助方法。这假设您使用Devise之类的内容,它提供了current_user
方法来获取当前登录的用户。
另一个注意事项。您应该更改路线中的匹配,以指定只有获取请求对编辑操作有效。
current_user
如果您试图阻止用户编辑其他人的个人资料,则在加载用户后需要执行以下操作:
get 'profile/edit' => 'users#edit' , as: edit_profile
这将使当前用户不会编辑其他用户的个人资料。
答案 1 :(得分:0)
如果您想允许登录用户更改其个人资料,您可能希望在会话中存储用户的ID。
因此,当用户登录时,将其ID保存到会话中:
session[:user_id] = ...
然后你的编辑方法看起来像
def edit
@user = User.find(session[:user_id])
end
如果该解决方案不是您想要的,那么您可能只需要在匹配代码中添加':id'参数。