我刚开始使用Rails 3,我不太明白如何重命名路由。
我想要的是什么:
重命名users#show
控制器/操作对的路径。因此,网址不是www.example.com/users/show/1
,而是www.example.com/1/home
将来,我还希望能够在末尾添加其他路径,例如:
www.example.com/1/home/profile/
我的用户资源设置方式:
resources :users, :except => [:destroy] do
resources :favorites, :only => [:show, :update]
resources :profiles, :only => [:show, :update]
end
我尝试了什么:
match :home, :to => 'users#show'
发生了什么:
ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User without an ID
development.log文件中有什么:
Started GET "/home" for 127.0.0.1 at 2011-03-10 13:36:15 -0500
Processing by UsersController#show as HTML
[1m[35mUser Load (1.6ms)[0m SELECT "users".* FROM "users" WHERE ("users"."id" = 101) LIMIT 1
Completed in 192ms
ActiveRecord::RecordNotFound (Couldn't find User without an ID):
app/controllers/users_controller.rb:19:in `show'
用户控制器中包含哪些内容:
def show
@user = User.find(params[:id])
respond_to do |format|
format.html # show.html.haml
end
end
所以,显然它存储了用户ID,如开发日志中显示为101
,但无论出于何种原因我仍然会收到此错误?
非常感谢您提供的任何帮助!
答案 0 :(得分:2)
您应该在匹配中提供细分键:
match ':id/home' => 'users#show'
但是通过这次重命名,你将得不到RESTful路线。
另一件事是用户个人资料。如果一个用户只能有一个配置文件,最好声明单个资源路由:
resources :users do
resource :profile
end
答案 1 :(得分:0)
我无法解释为什么它正在发出SQL请求,但它没有使用101来查找用户。如果是,你会收到这个错误:
ActiveRecord::RecordNotFound: Couldn't find User with ID=101
因为它显示Coundln't find User without and ID
,所以它可能正在调用User.find(nil)
无论如何,我们在我们的应用程序中做了类似的事情,除了名字而不是ID。它们在routes文件的底部匹配,如下所示:
match '/:current_region' => 'offers#show', :as => 'region_home'
然后在控制器中,您可以从参数params[:current_region]
:
def load_region
@current_region = Region.find_by_slug(params[:current_region] || cookies[:current_region])
end
我们在很多操作之前使用它作为过滤器,所以我们这样定义它而不是在show
动作中明确地调用它:
class OffersController < ActionController::Base
before_filter :load_region
def show
# do stuff with @current_region here
end
end
您只需将:current_region
更改为:id