Ресурс Rails 'show' отображается без идентификатора и создает ссылки /users.id вместо / users / id - PullRequest
2 голосов
/ 01 июня 2011

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

Проблема в том, что я не понимаю, откуда берется 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, по-видимому, заняли место индекса # пользователей, что было бы правильным для / users. Поскольку это все в значительной степени стандартная маршрутизация без каких-либо настраиваемых маршрутов с точки зрения рассматриваемой проблемы, я совершенно не в курсе. Есть идеи?

Редактировать: код пользователя # show так же прост:

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

1 Ответ

8 голосов
/ 01 июня 2011

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

Кроме того, измените link_to на user_path вместо users_path:

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