рельсы 3 вопрос маршрутизации (Ошибка маршрутизации "Не найдено ни одного маршрута ...") - PullRequest
0 голосов
/ 27 января 2011

Я использую ruby ​​1.9.2 и rails 3 и думаю, что у меня довольно простая проблема с маршрутизацией.

У меня есть модель с именем AdvancedQuery.Его контроллер AdvancedQueriesController. Почти все сделано стандартным способом рельсов, кроме маршрутизации.Я хотел изменить имена URL-адресов, и я хотел изменить несколько других вещей (см. Ниже).

Вот соответствующая часть моего файла rout.rb

get   "advanced_query" => "advanced_queries#new", as: :new_advanced_query
post  "advanced_query(/:hash_value)(/:page)" => "advanced_queries#create",  as: :create_advanced_query
get   "advanced_query/:hash_value(/:page)"  => "advanced_queries#search",  as: :advanced_query_search

Здесьтакое поведение, которое я ожидаю при работе с AdvancedQuery:

  1. Пользователь переходит на http://localhost:3000/advanced_query (запрос на получение), и браузер вызывает "новый" метод в advanced_queries_controller.new.html.haml отображается, который показывает пользователю стандартную форму для заполнения.
  2. Затем пользователь вводит данные в форму поиска и нажимает «Submit»
  3. «Submit» вызывает метод «create»и создает запись «AdvancedQuery» в базе данных.С объектом AdvancedQuery связан 32-символьный хеш, который 1) идентифицирует запрос и 2) используется как часть полученного URL (см. Шаг 4).
  4. Метод create перенаправляет на «поиск»метод, в котором объект AdvancedQuery используется для поиска второй модели (называемой BusinessModel).Затем сервер отображает search.html.haml, затем показывает результаты AdvancedQuery, и он повторно отображает исходную форму на той же странице, что и результаты, в случае, если пользователь хочет запустить новый поиск.Сгенерированный здесь URL-адрес: http://localhost:3000/advanced_query/blah (где blah - это 32-символьный хэш, который конкретно связан с запросом).
  5. Теперь пользователь вводит новый поисковый термин, используя форму из веб-сайтастраница, сгенерированная на шаге 3. Он нажимает «submit», и метод «create» должен быть снова вызван (то есть мы повторяем шаги 3 и 4).т.е. создайте новый AdvancedQuery.

Вот что на самом деле происходит:

Шаги 1 - 4 работают как положено.Шаг 5 дает мне ошибку маршрутизации "No route matches "/advanced_query"

И файлы new.html.haml и search.html.haml отрисовывают один и тот же фрагмент (называемый _form.html.haml).

Итак, если я смотрю на _form.html.haml, я не вижу ничего плохого:

= form_for(@advanced_query, url: create_advanced_query_path) do |f|
  .actions
   # other generic form-related stuff

Вот соответствующая часть моего контроллера

  def new
    @advanced_query  = AdvancedQuery.new
  end

  def create
    advanced_query  = AdvancedQueryBuilder.build_advanced_query_from_post(request, params, current_user)
    redirect_to(advanced_query_search_path(hash_value: advanced_query.hash_value))
  end

  def search
    return render :bad_request unless request.get?
    @advanced_query  = AdvancedQuery.find_by_hash_value_and_user_id(params[:hash_value], current_user.id)
    @results              = BusinessModel.advanced_search(@advanced_query)
  end

Любые мысли о том, что вызываетмоя ошибка маршрутизации?

Спасибо!

Ответы [ 3 ]

1 голос
/ 27 января 2011

Ваш файл маршрутов должен выглядеть так:

get   "/advanced_query" => "advanced_queries#new", :as => :new_advanced_query
post  "/advanced_query(/:hash_value(/:page))" => "advanced_queries#create",  :as => :create_advanced_query
get   "/advanced_query/:hash_value(/:page)"  => "advanced_queries#search",  :as => :advanced_query_search
1 голос
/ 27 января 2011

Итак, я разобрался с ошибкой, хотя я не совсем уверен , почему происходит ошибка.

Оказывается, что хотя форма, отображаемая в search.html.haml, указана как "POST", и хотя в файле журнала указано, что это POST, получается, что это PUT!

Итак, если я изменю свой файл rout.rb следующим образом:

get   "advanced_query" => "advanced_queries#new", as: :new_advanced_query
post  "advanced_query(/:hash_value(/:page))" => "advanced_queries#create",  as: :create_advanced_query
put   "advanced_query(/:hash_value(/:page))" => "advanced_queries#create", as: :create_advanced_query
get   "advanced_query/:hash_value(/:page)"  => "advanced_queries#search",  as: :advanced_query_search

Тогда нет ошибки маршрутизации.

1 голос
/ 27 января 2011

Похоже, ваши круглые скобки в маршрутах.rb могут не совпадать правильно - вы хотите иметь

post  "advanced_query(/:hash_value(/:page))" => "advanced_queries#create",  as: :create_advanced_query

вместо

post  "advanced_query(/:hash_value)(/:page)" => "advanced_queries#create",  as: :create_advanced_query

Раздел 3 здесь: http://guides.rubyonrails.org/routing.html может помочь; не совсем понятно, что вы собираетесь передать.

...