Rails的资源已经'show'映射而没有ID,并创建/users.id链接而不是/ users / id

时间:2011-06-01 18:39:06

标签: ruby-on-rails rails-routing

对于我当前的路由,以下ruby on rails代码:

<%= link_to current_user.name, users_path(current_user) %>

生成如下链接:

<a href="/users.1">name</a>

反过来,Ruby on Rails很难理解这一点,因为它期望1成为格式:

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

Request
  Parameters: 
  {"format"=>"1"}

对于Rails来说,这样做并不是很有意义,因为它更应该是/users/1。但是,手动尝试这一结果会产生以下结果:

Routing Error
  No route matches "/users/1"

每手输入带有?id = param的ID,例如/users?id=1,工作正常。

问题是,我不明白users.id的来源,也不知道如何解决 - 我的路由文件看起来像

routes::Application.routes.draw do
  get "register" => "users#new", :as => "register"
  get "login" => "sessions#new", :as => "login"
  post "login" => "sessions#create", :as => "do_login"
  get "logout" => "sessions#destroy", :as => "logout"

  resource :users

  root :to => "pages#welcome"
end

除了上面提到的那些动作之外的所有动作都很好,但我想找出原因。 rake routes如下所示:

     users POST   /users(.:format)      {:action=>"create", :controller=>"users"}
 new_users GET    /users/new(.:format)  {:action=>"new", :controller=>"users"}
edit_users GET    /users/edit(.:format) {:action=>"edit", :controller=>"users"}
           GET    /users(.:format)      {:action=>"show", :controller=>"users"}
           PUT    /users(.:format)      {:action=>"update", :controller=>"users"}
           DELETE /users(.:format)      {:action=>"destroy", :controller=>"users"}

这里的问题似乎是用户#show似乎取代了用户#index,这对于/ users来说是正确的。由于这几乎都是默认路由,没有自定义路由的问题,我在这里很无能为力。有什么想法吗?

编辑:用户#show code简单如下:

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end
end

1 个答案:

答案 0 :(得分:8)

您可能希望自己的路线使用resources :users,而不是resource :users

另外,将link_to改为使用user_path而不是users_path

<%= link_to current_user.name, user_path(current_user) %>