我有一个问题,我是Rails的新手,我不确定什么是正确的。
def current_user
return unless params[:user_id]
@current_user ||= User.find(params[:user_id])
end
所以像这样我得到了当前用户。Rails检查参数中的user_id。
但如果我在/users/:id
路线上有这样的东西怎么办那么params是id而不是user_id,这就是为什么它有时无法正确设置时区的原因。如何处理这样的事情?
def set_time_zone(&block)
if params[:user]
Time.use_zone(params[:user][:time_zone], &block)
else
time_zone = current_user.try(:time_zone) || 'UTC'
Time.use_zone(time_zone, &block)
end
end
您可以覆盖UsersController
中的current_user
,以便它查看id
参数而不是user_id
。或者,您可以使用现有的方法和类似的回退:
@current_user ||= User.find_by_id(params[:user_id]) || User.find_by_id(params[:id])
不过我要提醒你不要把params[:id]
视为理所当然。如果我的用户id是5,没有什么可以阻止我访问/users/6
!
在我迄今为止看到的所有rails应用程序中,current_user
代表当前登录的用户。当前登录用户的id决不能通过params
发送,而是通过session
发送(因为每个人都可以操作参数)。
- 用户通过表单提交用户名/密码
- 控制器验证用户名/密码是否匹配以及是否正确
- 将用户的id设置为会话
然后你可以有
def current_user
@current_user ||= begin
User.find(session[:user_id]) if session[:user_id]
end
end
在您的应用程序控制器中。