Ошибка маршрутизации 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 должен находиться в верхней части файла, Это определенно не работает для меня. Интересно...