Маршрутизация Rails 3 с ресурсами в необязательной области

#ruby-on-rails #ruby-on-rails-3 #routes #nested-routes #custom-routes

#ruby-on-rails #ruby-on-rails-3 #маршруты #вложенные маршруты #пользовательские маршруты

Вопрос:

Я настроил свой версионный API таким образом, лишь слегка изменив для обратной совместимости. В моих маршрутах у меня есть:

 scope '(api(/:version))', :module => :api, :version => /vd ?/ do
    …
    scope '(categories/:category_id)', :category_id => /d / do
        …
        resources :soundsend
end
  

с уже достигнутой успешной целью достижения следующего URL-адреса в том же месте

 /api/v1/categories/1/sounds/2
/api/categories/1/sounds/2
/categories/1/sounds/2
/sounds/2
  

Моя структура каталогов выглядит следующим образом:

введите описание изображения здесь

Проблема, которую я вижу, заключается в моих поколениях ссылок в моих представлениях. Например, на странице sound show у меня есть button_to , чтобы удалить звук

 <%= button_to 'Delete', @sound, :confirm => 'Are you sure?', :method => :delete %>
  

Которая генерирует следующий URL в форме action :

 "/api/sounds/1371?version=1371"
  

И, кроме того, delete метод не работает, вместо этого он отправляется как POST

Интересными частями rake routes являются:

                      sounds GET    (/api(/:version))(/categories/:category_id)/sounds(.:format)                               {:controller=>"api/sounds", :version=>/vd ?/, :action=>"index", :category_id=>/d /}
                            POST   (/api(/:version))(/categories/:category_id)/sounds(.:format)                               {:controller=>"api/sounds", :version=>/vd ?/, :action=>"create", :category_id=>/d /}
                  new_sound GET    (/api(/:version))(/categories/:category_id)/sounds/new(.:format)                           {:controller=>"api/sounds", :version=>/vd ?/, :action=>"new", :category_id=>/d /}
                 edit_sound GET    (/api(/:version))(/categories/:category_id)/sounds/:id/edit(.:format)                      {:controller=>"api/sounds", :version=>/vd ?/, :action=>"edit", :category_id=>/d /}
                      sound GET    (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/vd ?/, :action=>"show", :category_id=>/d /}
                            PUT    (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/vd ?/, :action=>"update", :category_id=>/d /}
                            DELETE (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/vd ?/, :action=>"destroy", :category_id=>/d /}
  

и журналы сервера показывают:

 Started POST "/api/sounds/1371?version=1371" for 127.0.0.1 at Fri May 06 23:28:27 -0400 2011
  Processing by Api::SoundsController#show as HTML
  Parameters: {"authenticity_token"=>"W QlCKjONG5i/buIgLqsrm3IHi5gdQVzFGYGREpmWYs=", "id"=>"1371", "version"=>371}
  

Я использую jQuery в качестве своего UJS и имею самую последнюю версию rails.js для jQuery:

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script> <!-- must be >= 1.4.4 for the rails 3 link js to work—> 
<script src="/javascripts/jquery-ujs/src/rails.js?1304736923" type="text/javascript"></script>
  

Я знаю, что это так, tl;dr но мой вопрос таков: «Что мне нужно вставить в мой button_to link_to и другие теги просмотра, чтобы помощники URL сгенерировали правильный путь для моей настройки?» Я перепробовал практически все комбинации, которые только могу придумать, но никогда не могу заставить их оказаться в нужном месте.

Комментарии:

1. Используете ли вы jQuery или Prototype в качестве фреймворка JavaScript. И если да, то включено ли это в страницу, которая вызывает у вас проблемы? Кроме того, вы уверены, что ваш rails.js файл соответствует вашему фреймворку JavaScript? Я бы предположил, что проблема где-то в JavaScript. Но также странно, что действие show обрабатывает запрос POST.

2. Я использую jQuery 1.4.4 и самую последнюю rails.js также для jquery. Я обновил свой вопрос, чтобы показать JS в head

Ответ №1:

Оказывается, решение было простым. Здесь у меня были две ошибки, из-за которых был сгенерирован неправильный маршрут и URL-адрес для добавления параметров.

  1. над resources :sounds маршрутом у меня по ошибке была эта строка:

     match '/sounds/:id(/:format)' => 'sounds#show'
      

    У меня есть эта строка, так что sounds/123/xml ее можно кэшировать на странице. Это вызвало всю маршрутизацию на show , и я понял, что ошибка заключалась в том, что у меня было :format в скобках, и совпадение должно быть get . Теперь он читает:

     get '/sounds/:id/:format' => 'sounds#show'
      
  2. Далее, по button_to ссылке, я помещал @sound объект в качестве своего второго параметра. Rails пытался быть разумным, экстраполировать правильный URL из этого, но потерпел неудачу с необязательным параметром api :version . Изменение его на

     sound_path(:id => @sound.id)
      

    сработало как по волшебству.