Rails3单一路径掩盖:id

时间:2011-05-09 08:24:33

标签: ruby-on-rails-3 routing

2.5奇异资源下的Rails指南中,它声明了

  

有时候,你有一个资源   客户总是不抬头   引用ID。例如,你   希望/配置文件始终显示   当前登录的个人资料   用户。在这种情况下,您可以使用   奇异的资源来映射/配置文件   (而不是/ profile /:id)到节目   动作。

所以我尝试了这个例子:

match "profile" => "users#show"

但是,当我尝试转到profile_path时,它会尝试重定向到以下内容,其中id =:id:

/profile.id

这代表两个问题:

  1. 我根本不想显示id,并认为这是掩盖id的路由模式
  2. 使用此方法会导致以下错误。当我尝试请求user_path时,它也会导致此错误。
  3. 错误:

    ActiveRecord::RecordNotFound in UsersController#show
    
    Couldn't find User without an ID
    

    我想这是因为传递的参数看起来像这样:

    {"controller"=>"users", "action"=>"show", "format"=>"76"}
    

    我是否正确使用单一资源?

    我的UsersController:

      def show    
        @user = User.find(params[:id])
    
        respond_to do |format|
          format.html # show.html.erb
          format.xml  { render :xml => @user }
        end
      end
    

    我的路线:

      resources :users
      match "profile"  => "users#show"
    

4 个答案:

答案 0 :(得分:4)

首先,如果您想使用profile_urlprofile_path,则必须使用:as,如下所示:

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

您可以找到解释here

其次,在您的控制器中,您依靠params[:id]找到您要查找的用户。在这种情况下,没有params[:id],因此您必须重写控制器代码:

def show
  if params[:id].nil? && current_user
    @user = current_user
  else
    @user = User.find(params[:id])
  end

  respond_to do |format|
    format.html # show.html.erb
    format.xml  { render :xml => @user }
  end
end

答案 1 :(得分:2)

它查找:id,因为您的路线文件中可能已有资源配置文件:

resoruce(s): profile

如果是这样,请尝试在新行match "profile" => "users#show

下移动该行

它应该获得较低的优先级,并且应该在读取资源:profile之前读取新行。

让我知道这是否是问题,如果你解决了。

答案 2 :(得分:2)

或者

get "/profile/:id" => "users#show", :as => :profile
# or for current_user
get "/profile" => "users#show", :as => :profile

resource :profile, :controller => :users, :only => :show

答案 3 :(得分:0)

我是这样做的:

resources :users
  match "/my_profile" => "users#show", :as => :my_profile

为了使其可行,我还必须编辑我的控制器代码:

def show

    current_user = User.where(:id=> "session[:current_user_id]")
    if params[:id].nil? && current_user
      @user = current_user
    else
      @user = User.find(params[:id])
    end

    respond_to do |format|
      format.html # show.html.erb`enter code here`
      format.xml  { render :xml => @user }
    end
  end

最后只提供my_profile的链接:

<a href="/my_profile">My Profile</a>