我有一个现有的代码库,我试图从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 (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
继承人’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
继承我的开发日志:
Started POST "/assets" for 127.0.0.1 at 2015-05-27 09:39:42 -0400
(是的,那就是所有日志都有)
发布数据:
{
“ASSET_TYPE”: “文件”,
“头衔”: “DNS”,
“heading_id”:9999,
“版权保护”:假的,
“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中的某种保留端点?
解决方法
这不仅仅是关于资产这个词.当路径路径和资产目录位于同一子目录中时,Rails不喜欢.
在发布帖子请求时,您将获得不允许的方法.问题是路径和资产目录不能重叠.问题特别在于该路径中的POST请求.我假设在rails中的某个地方,他们必须禁用资产目录的所有非GET请求.
在下面这个非常简单的应用程序中,您将获得一个方法不允许错误.因为路径/ welcome用于路由和资产前缀.
文件:config / environment / development.rb
config.assets.prefix = '/welcomes'
文件:config / routes.rb
resources :welcomes,path: 'welcomes',only: ['index','create']
文件:app / controllers / welcome_controller.rb
class WelcomesController < ApplicationController def index @welcome = 'hello'; end def create @welcome = 'world'; end end
文件:app / views / welcome / index.html.rb
<%= form_for(@welcome) do |f| %> <%= f.submit 'Submit' %> <% end %>
文件:app / views / welcome / create.html.rb
<h1>Welcomes#create</h1> <p>Find me in app/views/welcomes/create.html.erb</p>