Rails 3 маршрутизация с ресурсами в необязательной области видимости - PullRequest
2 голосов
/ 07 мая 2011

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

scope '(api(/:version))', :module => :api, :version => /v\d+?/ do
    …
    scope '(categories/:category_id)', :category_id => /\d+/ do
        …
        resources :sounds
        …
    end
end

с уже достигнутой успешной целью, чтобы следующие URL достигли того же места

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

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

enter image description here

Проблема, с которой я сталкиваюсь, заключается в моих поколениях ссылок в моих взглядах. Например, на странице звукового шоу у меня есть 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=>/v\d+?/, :action=>"index", :category_id=>/\d+/}
                            POST   (/api(/:version))(/categories/:category_id)/sounds(.:format)                               {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"create", :category_id=>/\d+/}
                  new_sound GET    (/api(/:version))(/categories/:category_id)/sounds/new(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"new", :category_id=>/\d+/}
                 edit_sound GET    (/api(/:version))(/categories/:category_id)/sounds/:id/edit(.:format)                      {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"edit", :category_id=>/\d+/}
                      sound GET    (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"show", :category_id=>/\d+/}
                            PUT    (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :action=>"update", :category_id=>/\d+/}
                            DELETE (/api(/:version))(/categories/:category_id)/sounds/:id(.:format)                           {:controller=>"api/sounds", :version=>/v\d+?/, :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 Ответ

2 голосов
/ 07 мая 2011

Оказалось, что решение было простым.У меня было две ошибки, из-за которых генерировался неправильный маршрут, а 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)
    

    работает как шарм.

...