Ресурс Rails имеет отображение «show» без идентификатора и создает ссылки /users.id вместо /users/id

Для моей текущей маршрутизации следующий код 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=, например /users?id=1, работает нормально.

Проблема в том, что я не понимаю, откуда берется user.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"}

Проблема здесь, похоже, в том, что users#show, похоже, занял место users#index, что было бы правильно для /users. Поскольку все это в значительной степени маршрутизация по умолчанию без настраиваемых маршрутов с точки зрения проблемы, я здесь совершенно невежественен. Есть идеи?

Изменить: код users#show так же прост, как:

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

person mabako    schedule 01.06.2011    source источник


Ответы (1)


Вероятно, вы хотите, чтобы ваш маршрут использовал resources :users, а не resource :users.

Кроме того, измените link_to, чтобы использовать user_path вместо users_path:

<%= link_to current_user.name, user_path(current_user) %>
person Dylan Markow    schedule 01.06.2011