你可以通过routes.rb将参数传递给控制器​​而不会出现在URL中吗?

时间:2011-07-04 20:53:29

标签: ruby-on-rails

假设我希望www.example.com/profile将用户重定向到他或她的个人资料页面。所以我想要做的是将“/ profile”与“users#show”匹配,但也让控制器知道当前用户是谁。有什么方法可以在路由文件中将params [:id]或params [:user_id]设置为session [:user_id]吗?我知道这可能不是实现我想要完成的目标的最佳方式。我只是想知道它是否可能,以及如果它是如何做到的。

2 个答案:

答案 0 :(得分:4)

将'/ profile'路由到'users#show',然后将params值设置为会话值(如果尚未设置)。您不能在路径文件中设置它,但您可以在控制器中执行此操作。

路线:

match '/profile' => 'users#show

控制器:

class UserController < ApplicationController

  def show
    params[:id] ||= session[:user_id]

    @user = User.find(params[:id)
  end

end

您需要在控制器中进行一些额外的检查,以确保您的用户实际上是他们在会话中的人,我假设您正在使用某种身份验证库。

答案 1 :(得分:0)

如果你想完成这个,你根本不应该让它出现在你的路线中。

它应该保留:

match "/profile" to "users#profile"

因为您在会话中有信息,所以您只需要在控制器中获取它。

User.find(session[:user_id])

最好的方法是before_filter检查用户是否已登录,这样您就不会因为会话为零而面临错误。