2015-05-27 3 views
7

У меня есть существующий кодовое что я пытаюсь обновить Rails 3.2 до Rails 4.0Rails 4 Method Not Allowed после обновления с Rails 3

У меня есть контроллер называется assets_controller с помощью метода «создать» и I есть запись в моих маршрутах файл:

resources :assets 

Использования Jquery на переднем конце, если я отправить пост запрос на «/ активы» от Брауэра, я получаю 405 (Method Not Allowed):

$.ajax({method: 'POST', data: asset, url: '/assets' }); 

В Rails 3 это отлично работало, и я не могу понять, в чем проблема.

Обновления:

Heres упрощенный вариант моего контроллера:

class AssetsController < ApplicationController 
    skip_before_filter :verify_authenticity_token 
    def create 
     # params[:assets] is passed if a mass addition of assets (i.e. book) occurs 
     assets = [] 
     if params[:assets] 
      assets = params[:assets] 
     else 
      assets.push params 
     end 

     last_asset_id = 0 

     assets.each do |asset_data| 
      asset = Object.const_get(asset_data[:asset_type]).new(asset_data) 
      if !asset.save 
      json_false_errors(asset.errors.full_messages) 
      return 
      else 
      last_asset_id = asset.id 
      end 
     end 
     end 
end 

Heres выход из

assets GET  /assets(.:format)          assets#index 
              POST  /assets(.:format)          assets#create 
           new_asset GET  /assets/new(.:format)         assets#new 
           edit_asset GET  /assets/:id/edit(.:format)        assets#edit 
            asset GET  /assets/:id(.:format)         assets#show 
              PATCH  /assets/:id(.:format)         assets#update 
              PUT  /assets/:id(.:format)         assets#update 
              DELETE  /assets/:id(.:format)         assets#destroy 

Heres мой журнал разработки рейк маршруты ":

Started POST "/assets" for 127.0.0.1 at 2015-05-27 09:39:42 -0400 

(да вот и все бревно имеет)

POST ДАННЫЕ: { "asset_type": "документ", "название": "DNS", "heading_id": 9999, "авторское право": ложные, "URL": "https://confidental.url", "pubtitle": "DNS", "автор": ""}

Другого Edit: Я закомментирована целые мои маршруты файл для диагностических целей, эти результаты Выполнение некоторых ручных испытаний:

POST http://localhost:8000/assets 405 (Method Not Allowed) 
POST http://localhost:8000/asset 404 (Not Found) 
POST http://localhost:8000/ass 404 (Not Found) 

- это активы какой-то зарезервированной конечной точки в рельсах 4?

+0

Это может быть просто догадка, но рельсы 4 проверки для подделки запроса на межсайтовый запрос. Это означает, что вы не можете отправлять сообщения на маршрут без токена csrf. Вы должны дать более подробную информацию о проблеме. Как и код контроллера и как данные 'asset' выглядят так, как будто вы отправляете на контроллер. Rails 4 руководство по безопасности: http://guides.rubyonrails.org/security.html – JensDebergh

+0

Я добавил 'skip_before_filter: verify_authenticity_token' к моему контроллеру, который, как мне кажется, должен пропустить любую проверку токена csrf, но это не похоже на Помогите. – denodster

+0

@JensD Я добавил запрошенную информацию – denodster

ответ

5

Речь идет не только о слове assets. Rails не нравится, когда путь маршрута и каталог ресурсов находятся в одном и том же подкаталоге.

При оформлении поста, вы получите method not allowed. Проблема в том, что не может быть перекрытия с путями и каталогом ресурсов. Проблема заключается именно в запросах POST на этом пути. Я предполагаю, что где-то в rails, они должны были отключить все запросы без GET для каталога ресурсов.


В этом очень простое приложение ниже, вы получите ошибку method not allowed. Поскольку путь /welcomes используется для маршрута и для префикса активов.

Файл: config/environment/development.rb

config.assets.prefix = '/welcomes' 

Файл: config/routes.rb

resources :welcomes, path: 'welcomes', only: ['index', 'create'] 

Файл: app/controllers/welcomes_controller.rb

class WelcomesController < ApplicationController 
    def index 
    @welcome = 'hello'; 
    end 

    def create 
    @welcome = 'world'; 
    end 
end 

Файл: app/views/welcomes/index.html.rb

<%= form_for(@welcome) do |f| %> 
    <%= f.submit 'Submit' %> 
<% end %> 

Файл: app/views/welcomes/create.html.rb

<h1>Welcomes#create</h1> 
<p>Find me in app/views/welcomes/create.html.erb</p> 
+0

Отправляет ... http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets – denodster

+0

У меня есть модель с именем assets, и я использую префикс в производстве. Оказывается, мне также нужно использовать префикс в разработке. –

8

Оказалось, что проблема связана с названием «активы». Я не могу найти документацию, подтверждающую это, но переименование модели и контроллера актива на что-то еще устранила проблему.

+1

Аналогичные результаты с этой целью. Я выбрал ленивое решение просто обернуть маршрут в объеме. – fatty

+1

была ваша модель, называемая «актив»? – denodster

+4

Это было, но проблема выглядела так, как будто это произошло от названия маршрута. Определить его как «область: что-то делать ресурсы: активы end» было самой простой вещью, о которой я мог подумать, чтобы обойти это и не влиять на имена контроллеров или моделей и структуру папок View. – fatty

1

Вопрос заключается в том, что ваши asset контроллер маршрутов конфликтует с рельсов по умолчанию /assets пути.

Самое простое решение изменить свой config/routes.rb строки файла следующим образом (или любой другой путь, по вашему выбору, который не assets):

resources :assets, path: 'site_assets'

Смежные вопросы