2015-09-22 2 views
0

я следующий маршрут в моем Rails проектаМоего Rails маршрут всегда будет показывать действие

resources :custom_urls, :path => '', :only => [:show, :new, :create] 

Мой маршрут работает отлично для show, new и create действия. Но когда я перехожу на другие пути, например

localhost:3000/index 

он всегда выходит на страницу показа. Из-за этого я получаю ошибку, потому что моя переменная экземпляра в действии show не установлена. Как я могу избежать этой проблемы? Я хочу получить 404, когда я пытаюсь перейти на другие маршруты. Я хочу, чтобы мое приложение было направлено на show, new и create действие.

Заранее спасибо.

Upate

Ниже приведены мои маршруты

Prefix Verb URI Pattern Controller#Action 
     root GET/   custom_urls#new 
custom_urls POST/   custom_urls#create 
new_custom_url GET /new(.:format) custom_urls#new 
custom_url GET /:id(.:format) custom_urls#show 
+0

показать результат: 'bundle exec rake routes', пожалуйста. –

+0

У меня есть вопрос с помощью 'routes'. – Reboot

+0

Причина, по которой я использую ': path => ''', чтобы я мог набрать 'localhost: 3000/new', а не' localhost: 3000/custom_urls/new' – Reboot

ответ

0

Вы получаете ActiveRecord :: RecordNotFound исключение? Если это так, он работает как ожидалось. В dev он отображает веб-консоль и в процессе производства будет отображаться public/404.html.

Btw, как пользователь переходит на localhost: 3000/index page? У вашего приложения есть пункт меню с/index?

Если вы внимательно следите за рейк-маршрутами, localhost: 3000/blah (когда blah не является новым) - это то же самое, что сказать, что приложение находит меня custom_url с id blah. В этом случае blah является индексом. Это может быть любая вещь, и если это действительный идентификатор, он будет извлекать запись. localhost: 3000/new имеет приоритет над localhost: 3000/notnew.

1

Нет ничего плохого в решении проблемы, вы просто немного обманом поведением Rails. То, что происходит, так как вы изменили путь маршрута по умолчанию: custom_urls к «», когда вы получаете доступ к следующему адресу:

localhost:3000/index 

Сервер думает о нем, как

localhost:3000/custom_urls/index 

Так он первый взгляд для действия под названием «index» на вашем контроллере. Поскольку вы не объявили об этом и указали, что этот маршрут на самом деле не существует в вашем route.rb, следующим логическим шагом для рельсов является «индекс» как идентификатор для объекта класса «Custom_url», и из-за этого он вызывает действие show, вызывающее ошибку.

В основном эта логика будет по каким-то вы типа так:

localhost:3000/XXXX 

или это, если изменить маршруты.гь

localhost:3000/custom_urls/XXXX 

Я не рекомендую следующий шаг, но если вы действительно хотите, чтобы перенаправить/индекс 404 вам нужно будет создать действие в маршрутах

resources :custom_urls, :path => '', :only => [:show, :new, :create, :index] 

Тогда внутри CustumUrlsController, создать «индекс» для перенаправления на ошибку 404

def index 
    raise ActionController::RoutingError.new('Not Found') 
end 
Смежные вопросы