Ruby on Rails 3 - Rails3 到 mask :id 的單異路線



2.5 Singular Resources 下的 Rails Guide 中,它指出

有时,您有一个资源 客户端总是在没有 引用 ID。例如,您 希望/profile 始终显示 当前登录的配置文件 用户。在这种情况下,您可以使用 要映射/配置文件的单一资源 (而不是/profile/:id) 到节目 行动。

所以我尝试了这个例子:

match "profile" => "users#show"

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

/profile.id

这代表两个问题:

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

错误:

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

我想这是因为通过的参数看起来像这样:

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

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

我的用户控制器:

  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"

首先,如果你想使用profile_urlprofile_path你必须使用这样的:as

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

您可以在此处找到解释。

其次,在您的控制器中,您依靠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

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

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

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

resoruce(s): profile

如果是这样,请尝试将该行移到新行下match "profile" => "users#show

它应该获得较低的优先级,并且应该在读取资源之前读取新行:配置文件.

让我知道这是否是问题所在,以及您是否解决了。

我是这样做的:

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>

相关内容

  • 没有找到相关文章

最新更新