Rails 3重命名路由

时间:2011-03-10 18:48:54

标签: ruby-on-rails ruby-on-rails-3 routing rename

我刚开始使用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,但无论出于何种原因我仍然会收到此错误?

非常感谢您提供的任何帮助!

2 个答案:

答案 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

即可