在 2.5奇异资源下的Rails指南中,它声明了
有时候,你有一个资源 客户总是不抬头 引用ID。例如,你 希望/配置文件始终显示 当前登录的个人资料 用户。在这种情况下,您可以使用 奇异的资源来映射/配置文件 (而不是/ profile /:id)到节目 动作。
所以我尝试了这个例子:
match "profile" => "users#show"
但是,当我尝试转到profile_path时,它会尝试重定向到以下内容,其中id =:id:
/profile.id
这代表两个问题:
错误:
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"
答案 0 :(得分:4)
首先,如果您想使用profile_url
或profile_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>