【问题标题】:Ajax won't send post to rails appAjax 不会将帖子发送到 Rails 应用程序
【发布时间】:2017-02-12 17:12:10
【问题描述】:

我有一个带有 rails 后端的 webpack 前端。它们在不同的端口上运行,我相信当我尝试将表单数据发布到我的 Rails 控制器端点之一时,这会给我带来问题。我已经用谷歌搜索了几个小时,我感到很沮丧。我不知道为什么我不能发送一个帖子请求。这是我的 ajax 请求:

handleSubmit(e) {
 e.preventDefault();
 $.ajax({
   type: "POST",
   dataType: "jsonp",
   contentType: "application/json; charset=utf-8",
   url: "http://localhost:3000/api/v1/organizations/",
   data: {
     organization: {
       name: $('#name').val(),
       email: $('#email').val(),
       description: $('#orgDescription').val(),
       password: $('#password').val(),
       password_confirm: $('#password_confirm').val(),
     }
   },
   success: function(data){
     debugger
   }, error: function(data){
     debugger
   }
 });
}

这是我的 Rails 控制器

def create
  debugger
  organization = Organization.new organization_params
  if organization.save
    render json: {organization: organization}, status: :ok
  else
    render json: {error: organization.errors.full_message}, status: :bad_request
  end
end

这是每次发送请求的方式:

Started GET "/api/v1/organizations/?callback=jQuery311014517798618579714_1486919266215&organization%5Bname%5D=asd&organization%5Bemail%5D=asdf&organization%5Bdescription%5D=asdf&organization%5Bpassword%5D=[FILTERED]&organization%5Bpassword_confirm%5D=[FILTERED]&_=1486919266216" for 127.0.0.1 at 2017-02-12 10:07:51 -0700
Processing by OrganizationsController#index as JSON
  Parameters: {"callback"=>"jQuery311014517798618579714_1486919266215", "organization"=>{"name"=>"asd", "email"=>"asdf", "description"=>"asdf", "password"=>"[FILTERED]", "password_confirm"=>"[FILTERED]"}, "_"=>"1486919266216"}

我唯一能想到的是我的开发服务器在端口 5000 上运行,而我的 rails 服务器在 3000 端口上运行。有人能告诉我我做错了什么吗?

【问题讨论】:

  • 您是否遇到特定错误?
  • 不,没有错误。问题是当我想发送 POST 时,我只能发送 GET 请求。
  • 我开始认为这是因为我的请求中没有 CSRF 令牌,但是当我的 webpack 条目 html 文件时我不知道如何获得一个
  • 您可能不希望永远这样,但您可以为特定控制器禁用 CSRF 令牌。更重要的是,您可以指定要在 CSRF 禁用中包含或排除哪些方法。
  • nvm,我已经在我的控制器中禁用了 CSRF :( before_action :verify_authenticity_token 所以现在我迷路了

标签: ruby-on-rails ruby ajax reactjs webpack


【解决方案1】:

您需要 configure some CORS into your application 并停止使用 JSONP 处理 POST 请求,因为 you can't POST using JSONP

安装 gem rack-corsgem 'rack-cors', :require => 'rack/cors' 添加到您的 Gemfile,运行 bundle install 并尝试为 config/application.rb 进行松散配置:

# Rails 3/4

config.middleware.insert_before 0, "Rack::Cors" do
  allow do
    origins '*'
    resource '*', :headers => :any, :methods => [:get, :post, :options]
  end
end

# Rails 5

config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'
    resource '*', :headers => :any, :methods => [:get, :post, :options]
  end
end

您应该考虑在生产环境中进行更好的配置。

【讨论】:

  • 非常感谢。更好的产品配置是否包括指定源/资源以仅接受来自我的前端应用程序的请求?
  • muchos gracias :)
猜你喜欢
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2020-12-20
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多