Dojo request.post 到 Rails 失败

Dojo request.post to Rails Fails

我在 Rails 上将网站从 Symfony 转换为 Ruby,最后我的 javascript 弹出电子邮件联系表。我不想重写表单或 java 脚本,因为首先需要做大量工作才能使其正常工作。那将是第二阶段。

这是我遇到问题的地方:

    sendBtn = new Button({
    label: "Send",
    onClick: function(){
        if (emForm.validate() == true){
            // Post the data to the server
            request.post("/contact/create",
                {data: domForm.toObject("contact-form"),
                // Wait 2 seconds for a response
                timeout: 2000

            }).then(function(response){
            emailDialog.hide();
            alertDialog.set("content",response)
            alertDialog.show();
            });
        }
    }
},"submit-btn");

我知道它到达了 request.post,因为我在它之前复制了行 "email.Dialog.hide()" 并将其隐藏。后来我添加了代码来捕获任何错误。它会立即到达那里,而不是在两秒超时之后。顺便说一句,我在这里使用 dojo。所以我怀疑它不喜欢“/contact/create”,因为这是我唯一改变的东西。

在我的 routes.rb 我有:

  get 'contact/create'

我的 post 中的信息是否正确?如果不是我怎么去那里? java脚本包含在 application.html.erb 中,因此可以从网站上的所有页面调用它。

以防万一,我的 contact_controller.rb 目前是这样的:

class ContactController < ApplicationController
  def create
    respond_to do |format|
      #format.html {}
      #format.js   {}
      format.json { render :json => {:response => 'Amazing, it works'} }
    end
  end
  def show
  end
end

看看您在开发工具中的网络选项卡,它应该会告诉您失败的原因 post...我会说尝试将 handleAs: 'json' 选项添加到您的 request.post.有关 dojo/request 的更多信息,请阅读 this

事实证明,我在 request.post 语句中的路径是正确的。我发现我将 Javascript 复制到我的 html.erb 文件中,这样我就可以使用

<%= contact_create_path %>

在原地。我最终得到了相同的价值,所以这不是问题。然后我检查了我的 Firebug 控制台。 Rails 发送一个很好的问题转储。我遇到了 404 错误。问题是我正在做 post 并且没有路线。所以我将 routes.rb 文件从

更改为
get 'contact/create'

post 'contact/create'

如果我想做一个非Javascript版本,这可能会在以后给我带来其他问题。

然后我得到了另一个错误:

ActionController::InvalidAuthenticityToken in ContactController#create

在 Whosebug 的帮助下,我找到了解决方法。我在下面添加了第二行:

class ContactController < ApplicationController
  skip_before_filter :verify_authenticity_token
...

同样,此解决方案可能会导致其他问题。跳过验证似乎不是一件好事。我在使整个过程正常工作时遇到了许多其他问题,但它们特定于我的应用程序。