Маршрут не соответствует [GET] "/ microposts / x" Глава 10, учебник Hartl по Ruby on Rails, следует удалить ссылку - PullRequest
2 голосов
/ 28 февраля 2012

Я не могу понять, почему я получаю эту ошибку. Я знаю, что этот вопрос очень похож на этот вопрос , но у меня все ссылки jquery правильные, что подтверждается тем фактом, что я могу удалять пользователей без проблем, но не микросообщений. Когда я пробую пример в браузере и нажимаю ссылку удаления (http://localhost:3000/microposts/253) на микросообщении, хотя элемент действительно удаляется, браузер говорит:

Routing Error

No route matches [GET] "/microposts/253"
Try running rake routes for more information on available routes.

Результат теста:

Micropost pages micropost destruction as correct user should delete a micropost
     Failure/Error: expect { click_link "delete" }.should change(Micropost, :count).by(-1)
     ActionController::RoutingError:
       No route matches [GET] "/microposts/1"

routes.rb

  resources :users
  resources :sessions, only: [:new, :create, :destroy]
  resources :microposts, only: [: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'

  root to: 'static_pages#home'...

Микросообщения удалить ссылку:

<%= link_to "delete", micropost, method: :delete,
                                 confirm: "You sure?",
                                 title: micropost.content %>

Контроллер микросообщений:

class MicropostsController < ApplicationController
  before_filter :signed_in_user, only: [:create, :destroy]
  before_filter :correct_user,   only: :destroy

    def create
        @micropost = current_user.microposts.build(params[:micropost])
        if @micropost.save
          flash[:success] = "Micropost created!"
          redirect_to root_path
        else
          @feed_items = []
          render 'static_pages/home'
        end
      end

      def destroy
        @micropost.destroy
        redirect_back_or root_path
      end

      private

        def correct_user
          @micropost = current_user.microposts.find_by_id(params[:id])
          redirect_to root_path if @micropost.nil?
        end
end

Я не могу найти репозиторий 3.2 для сравнения с моим sample_app, но я думаю, что выполнил руководство к письму. Любая помощь приветствуется.

Ответы [ 4 ]

1 голос
/ 28 февраля 2012

Да, проблема в том, что вы не обновили свои маршруты. В вашем файле rout.rb у вас есть resources :microposts, only: [:create, :destroy]. Маршрут, который он ищет, это: show to: microposts.

Не видя код вашего контроллера, я подозреваю, что после удаления микросообщения вы пытаетесь перенаправить обратно на микросообщение. Либо обновите свой маршрут до этого: resources :microposts, only: [:create, :destroy, :show], либо опубликуйте детали вашего контроллера микросообщений.

0 голосов
/ 30 ноября 2018

У меня была такая же проблема, и после перезапуска сервера rails он работал нормально для меня. [опубликовать, если кто-то посещает эту страницу в последнее время]

0 голосов
/ 13 марта 2012

Я работаю через тот же учебник, и у меня та же проблема.Мой анализ заключается в том, что проблема в том, что мы используем redirect_back_or root_path в контроллере микросообщений (~ / rails_projects / sample_app / app / controllers / microposts_controller.rb):

class MicropostsController < ApplicationController
...
  before_filter :correct_user,   only: :destroy
...
  def destroy
    @micropost.destroy
    logger.debug "in MicropostsController.destroy:"
    logger.debug " root_path=#{root_path}"
    logger.debug " session[:return_to]=#{session[:return_to]}"
    redirect_back_or root_path
  end

Вывод из logger.debugпоказанные операторы:

in MicropostsController.destroy:
 root_path=/
 session[:return_to]=/microposts/28

Напомним, что redirect_back_or определен в session_helper.rb как:

  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    clear_return_to
  end

Таким образом, вызов redirect_back_or root_path приведет к:

redirect_to(/microposts/28)

Я новичок здесь, но я думаю, что действием по умолчанию является GET;по крайней мере, это согласуется с тем, что я вижу, то есть именно поэтому мы публикуем GET в /microposts/28.

Между тем, в routs.rb мы определили микросообщения ресурсов, которые поддерживают только createи уничтожить действия:

resources :microposts, only: [:create, :destroy]  

Конечно, мы не хотим получать микросообщение, которое мы только что удалили;мы хотим перерисовать (или перенаправить?) обратно на страницу, с которой мы пришли.В качестве доказательства того, что этот анализ является правильным, я обнаружил, что вызов redirect_to root_path вместо redirect_back_or root_path «работает», когда микросообщение удаляется (после всплывающего подтверждения) и возвращает пользователя на домашнюю страницу.(показывает, что удаленный микросообщение пропало).

Теперь я изменил свой, чтобы снова появилась страница, с которой было вызвано действие удаления:

  def destroy
    @micropost.destroy 
    redirect_to request.referer
  end

Я также изменилмое определение SessionsHelper#store_location:

  def store_location
    session[:return_to] = request.fullpath if ['show', 'edit'].include?action_name
  end

Итак, только действия «show» и «edit» пытаются возобновить после входа в систему.

0 голосов
/ 28 февраля 2012

Как я вижу, проблема в том, что ваш запрос на удаление идет как 'GET', но согласно преобразованиям REST это должен быть запрос 'POST',

И я только что создал пример приложения с Rails3.1.3 и его ссылка для удаления выглядит следующим образом:

. В этом случае я создал эшафот с именем User

<%= link_to 'Destroy', user, :confirm => 'Are you sure?', :method => :delete %>

. Вы можете проверить, что происходит с вашим запросом на удаление, используя Firebug с Firefox

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...