Rails - 在 redirect_to 中传递参数 - 是否只能使用 session?

5
我在我的应用程序中设置了一个控制器作为根。它接受一个名为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操作:
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]访问它。
会话(session)是否是存储此类内容的合适位置,还是通过重定向传递有更好的方法?谢谢!
1个回答

13

会话存储这种信息是可行的。根据您使用uid的方式,允许从URL中读取可能实际上是危险的。想象一下,如果最终用户具有恶意,并开始将其他用户的ID放入其中。

对于只持续到下一个请求的消息,Rails实际上有flash对象,可以为您传递它。

http://guides.rubyonrails.org/action_controller_overview.html#the-flash

也就是说,如果要重定向到URL并传递一些参数,请按以下方式进行:

redirect_to(new_user_path(:notice => 'Please register as a new user', :uid => 'ABCD'))

你想要传递的参数是传递给new_user_path方法的参数,而不是redirect_to方法的参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接