在Rails 4中用“普通”javascript发布AJAX请求,不使用jQuery

在Rails 4中用“普通”javascript发布AJAX请求,不使用jQuery,javascript,ruby-on-rails,ruby,ajax,ruby-on-rails-4,Javascript,Ruby On Rails,Ruby,Ajax,Ruby On Rails 4,我已经在谷歌上搜索了我的问题的解决方案,但还没有找到一个可靠的解决方案,部分原因是我的项目有多奇怪 我正在尝试用Rails 4后端制作一个简单的聊天应用程序,只使用香草javascript,不允许使用jQuery或Rails助手。我有一个GetAjax请求,它收集所有种子消息数据并在聊天中显示。然而,当我尝试向Rails后端编写POST请求时,我遇到了两个主要问题。它们之间可能有关联,也可能没有关联 我暂时克服的第一个问题是422状态错误无法处理的实体。我相信这是因为我的xmlhttp.setR

我已经在谷歌上搜索了我的问题的解决方案,但还没有找到一个可靠的解决方案,部分原因是我的项目有多奇怪

我正在尝试用Rails 4后端制作一个简单的聊天应用程序,只使用香草javascript,不允许使用jQuery或Rails助手。我有一个GetAjax请求,它收集所有种子消息数据并在聊天中显示。然而,当我尝试向Rails后端编写POST请求时,我遇到了两个主要问题。它们之间可能有关联,也可能没有关联

我暂时克服的第一个问题是422状态错误无法处理的实体。我相信这是因为我的xmlhttp.setRequestHeaderValue是错误的? 然而,我不知道他们还应该是什么。我暂时忽略了这个问题,在我的Rails MessagesController中添加了跳过过滤器:验证真实性标记。 有没有更优雅的方法来解决这个问题

这将导致我的下一个问题,即400状态错误错误错误请求。当我在运行服务器时查看终端上的错误时,问题看起来像

2014年11月26日17:32:48-0800开始为127.0.0.1发布帖子/消息 按MessagesController创建为*/* 参数:{user=>namechatsample,content=>messagechatsample} 在4ms内完成400个错误请求

ActionController::ParameterMissing param缺失或值为空:message:app/controllers/messages\u controller.rb:17:in message\u params'app/controllers/messages\u controller.rb:9:incremate'

任何指导和帮助都将不胜感激

这是我的密码。 Ajax调用

Rails 4消息控制器

class MessagesController < ApplicationController
 skip_before_filter  :verify_authenticity_token

 def index #returns last 10 messages
   render :json => Message.last(10)
 end

 def create #makes a new message
   msg = Message.new(message_params)
   msg.save
   render :json => msg
 end


 private
  def message_params
    params.require(:message).permit(:user, :content)
  end
end
如果您认为其他文件或代码位置存在问题,请让我知道

这将导致我的下一个问题,即400状态错误错误错误请求

您需要:消息,但只发送用户和内容

有没有更优雅的方法来解决这个问题

是的,如果您根本不想处理CSRF,可以将其放在application.rb中:

或者,您可以实施正确的CSRF处理:

然而,让我补充一点:Rails不太适合聊天应用程序。理想情况下,您需要comet-ish的东西,比如socket.io

这将导致我的下一个问题,即400状态错误错误错误请求

您需要:消息,但只发送用户和内容

有没有更优雅的方法来解决这个问题

是的,如果您根本不想处理CSRF,可以将其放在application.rb中:

或者,您可以实施正确的CSRF处理:

然而,让我补充一点:Rails不太适合聊天应用程序。理想情况下,您需要comet-ish的东西,比如socket.io。

422状态错误

422错误是因为默认情况下Rails通过真实性令牌添加。如果令牌无效或在422不存在,则POST/PUT/DESTROY请求将返回状态错误。要解决这个问题,您可以像之前一样禁用真实性检查,或者可以在ajax请求中发送所需的令牌,如中所述

400状态错误

这是因为您在控制器中定义的需要一个消息参数作为已发送参数的一部分。需要:消息。。。它允许一个“content”值作为嵌套参数。例如,所需的结构需要:

:message => {:content => 'message data'}
在javascript中,您已将消息的参数名作为“内容”发送,参数名必须为message[content]。例如:

xmlhttp.send("message[user]=" + user + "&message[content]=" + message + "");
422状态错误

422错误是因为默认情况下Rails通过真实性令牌添加。如果令牌无效或在422不存在,则POST/PUT/DESTROY请求将返回状态错误。要解决这个问题,您可以像之前一样禁用真实性检查,或者可以在ajax请求中发送所需的令牌,如中所述

400状态错误

这是因为您在控制器中定义的需要一个消息参数作为已发送参数的一部分。需要:消息。。。它允许一个“content”值作为嵌套参数。例如,所需的结构需要:

:message => {:content => 'message data'}
在javascript中,您已将消息的参数名作为“内容”发送,参数名必须为message[content]。例如:

xmlhttp.send("message[user]=" + user + "&message[content]=" + message + "");
你有:

 def message_params
     params.require(:message).permit(:user, :content)
 end
这需要在请求中向控制器传递强参数。根据这句话,json必须看起来像

 {"message" : {"user" : "someuserthing", "content" : "someusercontent"}}
看起来你离这并不遥远,但确保你的应用程序以这种格式传递JSON是第一步

顺便说一句,在控制台中查看实际传递的json是什么非常有用。在你的情况下,你说:

 Parameters: {"user"=>"namechatsample", "content"=>"messsagechatsample"}
如您所见,它没有message的根元素

祝你好运

您有:

 def message_params
     params.require(:message).permit(:user, :content)
 end
这需要在请求中向控制器传递强参数。根据这项声明,, json必须看起来像

 {"message" : {"user" : "someuserthing", "content" : "someusercontent"}}
看起来你离这并不遥远,但确保你的应用程序以这种格式传递JSON是第一步

顺便说一句,在控制台中查看实际传递的json是什么非常有用。在你的情况下,你说:

 Parameters: {"user"=>"namechatsample", "content"=>"messsagechatsample"}
如您所见,它没有message的根元素


祝你好运

嘿,阿玛丹,我很抱歉我是个笨蛋。。。但当你说我需要信息,但只发送用户和内容时,你能解释更多吗?我的xmlhttp.send是否应该包含消息值?请查看控制器中的消息参数。是你写的,不是我:你可能想要params.require:user,:content,根本不提:message,因为你的数据结构不适合你现在的数据结构。嘿,阿玛丹,我很抱歉我是这样一个傻瓜。。。但当你说我需要信息,但只发送用户和内容时,你能解释更多吗?我的xmlhttp.send是否应该包含消息值?请查看控制器中的消息参数。是你写的,不是我:你可能想要params.require:user,:content,根本不提:message,因为你的数据结构不适合你现在的数据结构。谢谢你的回复Pete,我已经找到了如何使用document.querySelectorAll'meta[name=csrf token]获取令牌的方法[0].content和你对嵌套参数的解释是非常棒的哦,耶!这是我的时刻。谢谢。谢谢你的回复Pete,我已经找到了如何使用document.querySelectorAll'meta[name=csrf token]'[0]获取令牌的方法。内容和你对嵌套参数的解释都很棒哦,耶!这是我的时刻。谢谢