我有一个控制器设置为我的应用程序的根目录。它接受一个名为uid的参数,并检查用户是否存在。如果没有,我希望它重定向到新用户页面并使用参数中的uid预填充uid字段。
在我的root_controller中:
def index
if params[:uid]
@user = User.find_by_uid(params[:uid])
if (!@user.blank?)
# do some stuff
else
session[:user_id] = params[:uid]
redirect_to(new_user_path, :notice => 'Please register as a new user')
end
else
# error handling
end
end
在我的users_controller中,GET / users / new action:
def new
@user = User.new
@user.uid = session[:user_id]
# standard respond_to stuff here
end
这一切都很好,但这是否可以接受?我最初尝试在重定向语句中传递uid,如:
redirect_to(new_user_path, :notice => 'Please register as a new user', :uid => params[:uid])
甚至用以下方法测试:
redirect_to(new_user_path, :notice => 'Please register as a new user', :uid => 'ABCD')
但似乎都没有将值传递给users_controller ...我无法使用来自该控制器的params [:uid]访问它。
会话是一个适当的地方来存储这样的东西,还是有更好的方法通过重定向传递它?谢谢!
答案 0 :(得分:13)
会话可以存储这种信息。根据您对uid
所做的操作,允许从URL中读取它可能实际上是危险的。想象一下,如果最终用户是恶意的,并开始将其他用户的ID放入其中。
对于应该只持续到下一个请求的消息,Rails实际上有flash
对象,它会为你传送它。
http://guides.rubyonrails.org/action_controller_overview.html#the-flash
那就是说,如果你想重定向到一个url并传递一些params,那就这样做:
redirect_to(new_user_path(:notice => 'Please register as a new user', :uid => 'ABCD'))
您要传递的参数是new_user_path
方法的参数,而不是redirect_to
方法。