在 2.5 Singular Resources 下的 Rails Guide 中,它指出
有时,您有一个资源 客户端总是在没有 引用 ID。例如,您 希望/profile 始终显示 当前登录的配置文件 用户。在这种情况下,您可以使用 要映射/配置文件的单一资源 (而不是/profile/:id) 到节目 行动。
所以我尝试了这个例子:
match "profile" => "users#show"
但是,当我尝试转到profile_path时,它会尝试重定向到以下内容,其中id = :id:
/profile.id
这代表两个问题:
- 我根本不希望显示 id,并认为这是一种掩盖 id 的路由模式
- 使用此方法会导致以下错误。当我尝试请求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_url
或profile_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>