rails 3 redirect_to将params传递给命名路由

时间:2010-12-14 15:17:24

标签: ruby

我找不到有关如何执行此操作的详细信息,即使有很多关于如何使用像redirect_to

这样的散列将params传递给重定向的建议
:action => 'something', :controller => 'something'

在我的应用程序中,我在路线文件中有以下内容

match 'profile'   =>  'User#show'

我的节目动作像这样松散

def show
 @user = User.find(params[:user])
  @title = @user.first_name
end

重定向发生在像

这样的用户控制器中
   def register
    @title = "Registration"
    @user = User.new(params[:user])

    if @user.save
      redirect_to  '/profile'
    end
  end

当我重定向时,问题出在注册操作中我如何传递params以便我可以从数据库中获取该用户或更好...我已经有一个用户变量,所以如何传递用户对象演出动作?

马修

2 个答案:

答案 0 :(得分:7)

如果您正在进行重定向,Rails实际上会向浏览器发送带有URL的302 Moved响应,浏览器会向该URL发送另一个请求。所以你不能像在Ruby中那样“传递用户对象”,你只能传递一些url编码的参数。

在这种情况下,您可能希望将路由定义更改为:

match 'profile/:id' => 'User#show'

然后像这样重定向:

redirect_to "/profile/#{@user.id}"

答案 1 :(得分:2)

首先,我会为您的路线命名,以便更轻松地使用它:

match '/profile/:id' => 'users#show', :as => :profile

然后您将重定向到它,如下所示:

redirect_to profile_path(@user) # might have to use profile_path(:id => @user.id)

然后从数据库中拉出用户:

def show
  @user = User.find(params[:id]) # :id comes from the route '/profile/:id'
  ...
end

顺便说一句,如果您使用Devise进行身份验证,它会为您提供current_user方法,因此您不需要传递用户的ID:

match '/profile' => 'users#show', :as => :profile

redirect_to profile_path

def show
  @user = current_user
end