jquery-ui可排序获取错误 - PUT 501(未实现)

时间:2013-03-08 16:49:50

标签: jquery ruby-on-rails apache jquery-ui

我有一个带有jquery-ui可排序列表的Rails应用程序。当用户从一个列表拖动到另一个列表时,wostatus_id字段会更新。因此,它在jquery Ajax更新上失败了。

这在localhost和Heroku上工作正常。但是,我正在将应用程序移动到Bitnami Virtual Server + Rails实现。我不知道它是否相关,但我在新服务器上使用node.js.

在这台新服务器上,我在浏览器控制台上收到此错误:

PUT http://ndeavor.ameipro.com/workorders/2 501 (Not Implemented) 

enter image description here

这是咖啡脚本:

  $("#sort1, #sort2, #sort3, #sort4, #sort5, #sort6, #sort7").sortable
    connectWith: ".connectedSortable"
    cursor: "move"
    update: ->
      $.post($(this).data('update-url'), $(this).sortable('serialize'))
    receive: (event, ui) ->
      str_id =  $(ui.item).attr('id')
      woid = str_id.split('_')[1]
      $.update "/workorders/" + woid,
        workorder:
        wostatus_id: $(this).data('wostatus-id')

感谢您的帮助!

UPDATE1

使用fullcalendar-rails月视图将事件从一天拖到另一天时,我遇到了同样的错误。

UDPATE2

我发现了这个“修复501错误代码 客户端应指定有效的请求类型。即便如此,如果Web服务器响应不正确,那么只需升级Web服务器即可解决问题。“

我确定请求没问题 - 相同的代码已经在localhost和Heroku上运行了好几个月。因此,它必须与我正在使用的新虚拟服务器有关。

新服务器是Bitnami Rails堆栈。它安装了node.js.我正在运行Apache,Passenger和PG。

如何升级服务器以解决问题?

UPDATE3

这个coffeescript得到了同样的答复:

updateEvent = (the_event) ->
 $.update "/events/" + the_event.id,
   event:
     title: the_event.title,
     starts_at: "" + the_event.start,
     ends_at: "" + the_event.end,
     description: the_event.description

UPDATE4

Apache能否停止使用PUT?也许是https.conf中的一些设置?

UPDATE5

使用Thin !!!相同的应用运行正常!所以,我将尝试使用Nginx和Thin。

UPDATE6

我无法让它发挥作用。所以,我将尝试Nginx和5个瘦应用服务器。

UPDATE7

我现在在Nginx和5台瘦服务器上运行Rails应用程序。我仍然得到501 PUT - jquery错误!!!!

如果我在端口3000上独立运行Thin,它可以正常工作。

如果我在端口80上运行Thin stand-alone,我会得到相同的JQUERY PUT 501错误。

因此,使用端口80的服务器出了问题。

5 个答案:

答案 0 :(得分:4)

我花了将近2周的时间来完成这项工作。我尝试过Apache + Passenger和Nginx + Thin。

最终,这些都不是原因。它与Rails应用程序设置无关。

这是一个正在停止PUT的Pound网络服务器。

答案 1 :(得分:2)

检查apache配置上的Limit关键字。

默认情况下,您可能会在某处出现类似的内容:

<Limit PUT DELETE>
    order deny,allow
    deny from all
</Limit>

这可以防止Web服务器接受任何PUT或DELETE请求,因此501(未实现)。

<强>更新

所以你找到的东西是:

<Limit GET POST OPTIONS>
    Order allow,deny
    Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
    Order deny,allow
    Deny from all
</LimitExcept>

这意味着只接受GETPOSTOPTIONS个查询(allow from all),此列表中不包含的任何内容(LimitExcept)将被拒绝({ {1}})。

如果您需要PUT关键字,请将其添加到这两个设置中Deny From AllLimit)。

请注意,这些限制仅适用于LimitExcept目录。

答案 2 :(得分:1)

您是否尝试过在没有可排序的情况下合成请求?我有一种潜在的怀疑,即JUI正在添加疯狂的临时元素,这些元素会疯狂地格式化您的请求。

或者,只要某些东西在本地运行但在服务器上运行,我就认为应该是异步的东西。

不是在排序时发出请求,而是注销请求的参数。他们有意义吗?

答案 3 :(得分:1)

如果你的服务器apache配置了很好的Virtualhost。使用gem install passenger和passenger-install-apache2-module进入你的rails应用程序。所以他告诉你需要添加到httpd.conf文件中的内容。通常你会接近这个。

Listen *:80
NameVirtualHosts *:80


LoadModule passenger_module /somewhere/passenger-x.x.x/ext/apache2/mod_passenger.so

PassengerRuby /usr/bin/ruby
PassengerRoot /somewhere/passenger/x.x.x
PassengerMaxPoolSize 10

<VirtualHost *:80>
    ServerName www.foo.com
    DocumentRoot /webapps/foo/public
    RailsBaseURI /rails
</VirtualHost>

但我建议你将Nginx与Passenger一起使用。

我也看一下:501 Method Not Found error on a javascript file - change name and it then works - why?

在这里,您可以找到使用Apache部署Rails应用程序的教程:Rails 3.1 application deployment tutorial

答案 4 :(得分:0)

遇到相同的问题,按照其他人的建议查看POUND反向代理服务器配置,然后将xHTTP的值更改为1来为我修复。

http://manpages.ubuntu.com/manpages/xenial/man8/pound.8.html See ubuntu POUND config details