从Rails 3升级后不允许使用Rails 4方法

我有一个现有的代码库,我试图从Rails 3.2升级到Rails 4.0

我有一个名为assets_controller的控制器,带有’create’方法,我的路由文件中有一个条目:

resources :assets 

在前端使用Jquery,如果我从一个浏览器向’/ assets’发送一个post请求,我得到405(Method Not Allowed):

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

这在Rails 3中运行得很好,我似乎无法弄清楚问题是什么。

更新:

这是我的控制器的简化版本:

 class AssetsController < ApplicationController skip_before_filter :verify_authenticity_token def create # params[:assets] is passed if a mass addition of assets (ie 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 

inheritance人’rake routes’的输出

  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 

inheritance我的开发日志:

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

(是的,那就是所有日志都有)

POST DATA:{“asset_type”:“Document”,“title”:“DNS”,“heading_id”:9999,“受版权保护”:false,“url”:“ https://confidental.url ”,“pubtitle”: “DNS”,“作者”:“”}

另一个编辑:为了诊断目的,我注释掉了我的整个路径文件,这些是做一些手动测试的结果:

 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) 

是资产在rails 4中的某种保留端点?

这不仅仅是关于assets这个词。 当路径路径和资产目录位于同一子目录中时,Rails不喜欢。

在发布post请求时,您将获得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

 

Welcomes#create

Find me in app/views/welcomes/create.html.erb

事实certificate,问题是名称’资产’我找不到任何文件来证实这一点,但是将资产模型和控制器重命名为其他修复问题的东西。

问题是您的asset控制器路由与rails default /assets路径冲突。

最简单的解决方案是将config/routes.rb文件行修改为如下所示(或您选择的非assets任何其他路径):

resources :assets, path: 'site_assets'