Ошибка маршрутизации Rails? "Нет маршрутов"
Итак, я продолжаю сталкиваться со следующей ошибкой:
No route matches {:action=>"show", :controller=>"users"}
Я попробовал запустить маршруты рейка, и я вижу, что маршрут существует:
user GET /users/:id(.:format) users#show
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
Но каждый раз, когда я пытаюсь посетить страницу "/users/1"
(1 является идентификатором пользователя), я получаю вышеуказанную ошибку. Есть идеи? Благодарю!
Здесь мой routes.rb
:
SampleApp::Application.routes.draw do
root to: 'static_pages#home'
resources :users
resource :sessions, only: [:new, :create, :destroy]
match '/signup', to: 'users#new'
match '/signin', to: 'sessions#new'
match '/signout', to: 'sessions#destroy', via: :delete
match '/help', to: 'static_pages#help'
match '/about', to: 'static_pages#about'
match '/contact', to: 'static_pages#contact'
Здесь мой users_controller.rb
:
class UsersController < ApplicationController
before_filter :signed_in_user, only: [:index, :edit, :update]
before_filter :correct_user, only: [:edit, :update]
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
sign_in @user
flash[:success] = "Welcome to the Paper Piazza!"
redirect_to @user
else
render 'new'
end
end
def edit
@user = User.find(params[:id])
end
def update
if @user.update_attributes(params[:user])
flash[:success] = "Profile updated"
sign_in @user
redirect_to @user
else
render 'edit'
end
end
def index
@users = User.paginate(page: params[:page])
end
private
def signed_in_user
unless signed_in?
store_location
redirect_to signin_path, notice: "Please sign in."
end
end
def correct_user
@user = User.find(params[:id])
redirect_to(root_path) unless current_user?(@user)
end
end
Ответы
Ответ 1
Попробуйте установить опечатку:
root :to 'static_pages#home'
(а не root to:
) и переместив его в последнюю строку блока. И дайте мне знать, если это имеет значение!
Что странно, что я построил новый проект с файлом маршрутизации, который просто читает:
RoutingTest::Application.routes.draw do
resources :users
root :to => "static_pages#home"
end
Когда я запустил это в консоли, я получил ту же ошибку, которую вы видите:
>> r = Rails.application.routes ; true
=> true
>> r.recognize_path("/users/1")
=> ActionController::RoutingError: No route matches "/users"
... но когда я запускаю одно и то же в немного более старшем проекте, я получаю:
>> r = Rails.application.routes ; true
=> true
>> r.recognize_path("/users/1")
=> {:action=>"show", :controller=>"users", :id=>"1"}
Таким образом, я не уверен, что то, что я говорю вам, будет иметь значение. (Помимо этого, трюк Rails.application.routes полезен для проверки путей в консоли!)
Ответ 2
У меня была аналогичная проблема, у меня были маршруты, которые просто вернули бы корневую страницу, но появятся в rake routes
. По словам другого разработчика для определенного пространства имен и для всех маршрутов, root to: (routing)
всегда должен быть последним. Это противоречит руководству Rails при маршрутизации (см. http://guides.rubyonrails.org/routing.html#using-root), в котором говорится, что любой вызов root должен находиться в верхней части файла, Это определенно не работает для меня. Интересно...