提交返回405方法不被允许。

21

我的Rails本地服务器遇到了问题,所有的Post请求都返回405方法不允许。然而我们的测试和生产服务器没有问题。甚至那些没有更新过的代码分支也会出现这个问题。在调试时,我发现它能够到达路由文件,但却无法到达控制器。

我已经尝试过删除gems并重新安装、从WEBrick切换到Puma、创建一个新的git项目克隆。

服务器

Started POST "/assets" for ::1 at 2015-07-14 12:14:27 -0400

Chrome浏览器中的网络选项卡

常规

Remote Address:[::1]:3000
Request URL:http://localhost:3000/assets
Request Method:POST
Status Code:405 Method Not Allowed

响应

HTTP/1.1 405 Method Not Allowed
Cache-Control:no-cache
Content-Length:18
Content-Type:text/plain
X-Request-Id:9b0b2dd2-065b-4610-91c9-36494ea95353
X-Runtime:0.145368

请求

POST /assets HTTP/1.1
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding:gzip, deflate
    Accept-Language:en-US,en;q=0.8
    Cache-Control:no-cache
    Connection:keep-alive
    Content-Length:8376627
    Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryx8y8PBySdt7dxs4A
    Cookie:activeAccordionGroup=collapseTwo; _fusion360_hub_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJWFlYmVlOGZjZmI3YzVlYjBjNjAyYzcyMzNhNzIyMzIwBjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMTllM2xhK1k4WG1hd2xYNnZCOEtHOEhPaHNTbWQvZGR2cGJ3bU9WUXIwRzg9BjsARg%3D%3D--4e108cb5f6eca3d986c0b3accec07bd2c27560b2; _mkto_trk=id:760-CWR-293&token:_mch-localhost-1435859445290-79614; _pk_id.845225.1fff=9847e7981c291a08.1435859445.1.1435859445.1435859445.; _allegorithmic-substance-marketplace_session=M3dMUCs4ZEtWSTFJTFVHV2VYN2pESFdHcGlHL2grVVVKSGxIWEZ3MlhXQkpRdHE2L0ZkMFpURmZDWGl6aTMxYSttMXFSQXN2M08zVVVXZTRHMDNKOHJOUzA1TmZoYnMwWURjb3c0Rkx6MTJYOW1Uem9aNGRObEMvc1NpSWo5VnQ4dUIzRnRtTFpnMlpOQVVZUU1SdWxiN1ZjN1lIMVd3Sk5jaXkyZkZLZ3duWTc4K2dnK0FSK29JVWdva2t0eUN1Q3hJbjFERHJVaGtndjVoWGxDRUlndz09LS1rZDdWcmtEWHlJWHRpZjc1MFNUSDF3PT0%3D--d34962721f449064dfdfd4629c0239ea1340aee4; __profilin=p%3Dt
    Host:localhost:3000
    Origin:http://localhost:3000
    Pragma:no-cache
    Referer:http://localhost:3000/assets/new
    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36

Tyler,你在使用任何CSRF保护吗? - adamliesko
我正在使用Rails 4,据我所知,我没有添加csrf保护。@AdamLieskovský - Tyler
3个回答

49

你有一个名为“assets”的路由,在Rails中它是一个保留的路由,专门用于Rails资产管道。

如果你必须使用“assets”路由,则需要通过在development.rbproduction.rb配置块中添加以下行来为资产管道提供另一个挂载点:

config.assets.prefix = '/assetz'

然后重新启动您的服务器。

通过这样,所有您的资产都将被挂载到"/assetz"上,您将能够在"/assets"上使用POST请求。

祝编码愉快!

参考:

1) StackOverflow


1
请问您能否发布您的路由文件以及开发环境和生产服务器上的确切Rails版本?
我猜想当您发布到仅被注册为GET请求的路由(取决于您的Rails版本)或者重复定义的路由时,可能会发生这种情况。例如:
resources :photos, :only => [:index]
get :photos

1
在ruotes.rb文件中,将您的路由包含在命名空间中,使其看起来像这样:
Rails.application.routes.draw do
  namespace 'api' do
    Your routes here
  end
end

然后,在同一命名空间下的文件夹中添加与这些路由对应的控制器,因此应用程序目录应如下所示:

app
|  controllers
|  |  api
|  |  |  Your controller files here

最后,控制器应该在与命名空间相同的模块中 但首字母要大写,因此每个控制器应该如下所示:
  module Api
    Your controller code here
  end

注意:您可以给每个相关的路由/控制器设置不同的命名空间/模块。此外,您还可以使用嵌套的命名空间/模块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接