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