Rails - 在redirect_to中传递参数 - 会话是唯一的方法吗?

Jim*_*Jim 5 ruby-on-rails

我有一个控制器设置为我的应用程序的根目录.它接受一个名为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
Run Code Online (Sandbox Code Playgroud)

在我的users_controller中,GET/users/new action:

def new
  @user = User.new
  @user.uid = session[:user_id]
  # standard respond_to stuff here
end
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但这是一种可以接受的方式吗?我最初尝试在重定向语句中传递uid,如:

redirect_to(new_user_path, :notice => 'Please register as a new user', :uid => params[:uid])
Run Code Online (Sandbox Code Playgroud)

甚至测试它:

redirect_to(new_user_path, :notice => 'Please register as a new user', :uid => 'ABCD')
Run Code Online (Sandbox Code Playgroud)

但似乎都没有将值传递给users_controller ...我无法使用来自该控制器的params [:uid]访问它.

会话是一个存储这样的东西的适当位置,还是有更好的方法通过重定向传递它?谢谢!

ctc*_*rry 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'))
Run Code Online (Sandbox Code Playgroud)

您要传递的参数是new_user_path方法的参数,而不是redirect_to方法.