如何使用JavaScript获取发布到Rails应用程序

如何使用JavaScript获取发布到Rails应用程序,javascript,ruby-on-rails,ruby,google-chrome-extension,fetch,Javascript,Ruby On Rails,Ruby,Google Chrome Extension,Fetch,我正在构建一个需要发布到Rails应用程序的Chrome扩展 我可以使用Fetch发送请求,但是当Rails处理请求时,JSON对象不正确。我的控制器返回一个错误: NoMethodError (undefined method permit' for #<String:0x00007ff83b5a36e8>) 数据对象应如下所示: {"highlight"=>"{\"text\":\"hello world!\",\"url\":\"helloworld.com\"}"}

我正在构建一个需要发布到Rails应用程序的Chrome扩展

我可以使用Fetch发送请求,但是当Rails处理请求时,JSON对象不正确。我的控制器返回一个错误:

NoMethodError (undefined method permit' for #<String:0x00007ff83b5a36e8>)
数据对象应如下所示:

{"highlight"=>"{\"text\":\"hello world!\",\"url\":\"helloworld.com\"}"}
{"highlight"=>{"text"=>"hello world!", "url"=>"helloworld.com"}}
出于某种原因,Rails将请求处理为带转义引号的字符串,而不是散列。我不知道如何从Fetch传递它,这样它就不会这样做

以下是JavaScript代码:

function captureHighlight(selection, tab) {
  const highlight = {
      text: selection.selectionText, 
      url: selection.pageUrl
  }

  return highlight;
}

async function postHighlight(highlight) {
  let formData = new FormData();
  formData.append('highlight', JSON.stringify(highlight));

  const response = await fetch('http://localhost:3000/highlights', {
    method: 'POST',
    body: formData,
  });

  console.log(response);
}

有两件事我做错了。我放弃了fetch,发现使用XMLHttpRequest更容易。我没有JSON字符串的问题,不管是什么原因。。。仅供参考,我的浏览器工具显示,当请求离开客户端时,我的json格式正确,无论是使用fetch还是xml

但是,更重要的是。我也有CORS问题。我应该回到Chrome扩展文档。我所要做的就是授予我想要的任何跨源资源的权限


感谢大家阅读/花时间

有两件事我做错了。我放弃了fetch,发现使用XMLHttpRequest更容易。我没有JSON字符串的问题,不管是什么原因。。。仅供参考,我的浏览器工具显示,当请求离开客户端时,我的json格式正确,无论是使用fetch还是xml

但是,更重要的是。我也有CORS问题。我应该回到Chrome扩展文档。我所要做的就是授予我想要的任何跨源资源的权限


感谢大家阅读/花时间

您应该在标题中包含“Content Type”:“application/json”,所有内容都可以。由于rails不知道您的内容是什么类型的,所以问题就出现了。

您应该在标题中包含“content type”:“application/json”,一切都会正常的。由于rails不知道您的内容是什么类型的,所以问题就出现了。

rails检查X-request-With标头是否包含XMLHttpRequest值。只需在标题中设置它,如下所示:

const response=等待获取'http://localhost:3000/highlights', { 方法:“POST”, 正文:formData, 标题:{ “X-request-With':“XMLHttpRequest” }, }; Rails会将请求检测为xhr,并以适当的格式返回响应。

Rails会检查X-request-With标头是否包含XMLHttpRequest值。只需在标题中设置它,如下所示:

const response=等待获取'http://localhost:3000/highlights', { 方法:“POST”, 正文:formData, 标题:{ “X-request-With':“XMLHttpRequest” }, };
Rails会将请求检测为xhr,并以适当的格式返回响应。

您的fetch将以x-www-form-urlencoded的形式发送数据,因此Rails会将发布的字段作为字符串进行处理。我不太了解Rails,但我认为它不知道如何自动确定请求参数是否是json,是否应该进行解析。我认为您可能会混淆将请求作为JSON而不是x-www-form-urlencoded发送的做法,如果是这种情况,请参见:Rails肯定不会自动检测和解析表单数据中的JSON字段。我认为任何合理的框架都不会。他们怎么知道您甚至打算将字段解析为JSON而不是代码片段呢?我能够以x-www-form-urlencoded的形式在Postman中发送请求,Rails应用程序成功地处理了该请求。我试图将邮递员请求与Fetch匹配,但Rails中存在字符串问题。我是否应该尝试将其作为application/json发送?我也无法让它与application/json一起工作。它使我的浏览器保持正确的格式,但rails会处理并将其格式化为我在问题中提到的内容。您的fetch将以x-www-form-urlencoded的形式发送数据,因此rails会将发布的字段作为字符串进行处理。我不太了解Rails,但我认为它不知道如何自动确定请求参数是否是json,是否应该进行解析。我认为您可能会混淆将请求作为JSON而不是x-www-form-urlencoded发送的做法,如果是这种情况,请参见:Rails肯定不会自动检测和解析表单数据中的JSON字段。我认为任何合理的框架都不会。他们怎么知道您甚至打算将字段解析为JSON而不是代码片段呢?我能够以x-www-form-urlencoded的形式在Postman中发送请求,Rails应用程序成功地处理了该请求。我试图将邮递员请求与Fetch匹配,但Rails中存在字符串问题。我是否应该尝试将其作为application/json发送?我也无法让它与application/json一起工作。它使我的浏览器保持正确的形式,但rails处理并将其格式化为我在问题中提到的内容。我尝试过,但没有成功。我一直不知道为什么。我放弃了fetch,选择了更可靠的XMLHttpRequest。谢谢我试过了,但是我 没有用。我一直不知道为什么。我放弃了fetch,选择了更可靠的XMLHttpRequest。谢谢