【问题标题】:Ajax Bad Request 400 RailsAjax 错误请求 400 Rails
【发布时间】:2016-11-22 11:34:30
【问题描述】:

我在使用 Ajax on Rails 时遇到了错误的请求错误 400。 当我提交表单时,我有一个字符串作为参数从 Jquery 发送,我想从 params[:assignee] 中检索它,以便我可以提取字符串并通过我的控制器保存它。 我的控制器:

    def create
    @task = Task.new(task_params)
    @task.user = current_user
    username = params.permit[:assignee]
    @task.assignee = username

    #set_category
    respond_to do |format|
      if @task.save
        format.html { redirect_to tasks_url, notice: 'Task was successfully created. '+task_params.inspect}

        #format.html { redirect_to @task, notice: 'Task was successfully created.' }
        format.json { render :show, status: :created, location: @task }
      else
        format.html { render :new }
        format.json { render json: @task.errors, status: :unprocessable_entity }
      end
    end
  end

def task_params
  params.require(:task).permit(:owner, :value, :completed, :category, :date, :assignee)

end

这是我的 JS:

 $( "#new_task" ).submit(function() {
    alert("form: "+assignee);
  //event.preventDefault();
 $.ajax({
   url: "/tasks",
   type: "POST",
   data: {assignee},
   dataType: "json",
   success: function(data) {
       alert('successfully');
     },
    error: function(xhr, textStatus, error) {
     alert(xhr.statusText+""+textStatus+""+error);
  }
   });
});

assignee 是在 jquery 自动完成表单中选择的用户名:

select: function(event, ui) {
    var terms = split(this.value);
    // remove the current input
    terms.pop();
    // add the selected item
    terms.push(ui.item.value);
    // add placeholder to get the comma-and-space at the end
    terms.push("");
    this.value = terms.join("");
    assignee=this.value;
    $('input[name=commit]').prop("disabled",false);

    return false;
}

我的根目录是“task/”,您可以在其中查看已保存的任务和创建新任务的表单。 我在网上搜索了很多,我都试过了。我能怎么做?非常感谢

【问题讨论】:

  • 你在浏览器控制台中得到了什么?
  • 404错误意味着客户端找不到路由。检查你的 routes.rb。
  • 对不起,我的错!是 400。控制台:localhost:3000/tasks400(错误请求)
  • @AlexBeginner assignee 变量里面是什么?您能否将该变量的输出添加到问题正文中?
  • 受让人是一个字符串

标签: javascript jquery ruby-on-rails ajax bad-request


【解决方案1】:

400 Bad Request - 服务器不能或不会处理到期的请求 到明显的客户端错误(例如,请求语法格式错误、太大 大小、无效的请求消息帧或欺骗性请求路由)。

wiki

ajax代码更改为:

$.ajax({
   url: "/tasks",
   type: "POST",
   dataType: "json",
   headers: {
      'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'), // Optional
      'Content-Type': 'application/json'
   },
   data: JSON.stringify({ assignee: assignee }),
   success: function(data) {
       alert('successfully');
   },
   error: function(xhr, textStatus, error) {
     alert(xhr.statusText+""+textStatus+""+error);
   }
});

{assignee} 这是一个无效的 JSON 对象,它应该是 {assignee: assignee} 您还应该添加一个有效的标题,'Content-Type' 和(X-CSRF-TOKEN 可选)

【讨论】:

  • 好的,现在浏览器控制台中没有错误,但是我看不到参数被分配者(如您所见,我已经“通知 task_params.inspect”来检查传递了哪些参数)。警报显示错误“错误”。
  • assignee=this.value; 应该是var assignee=this.value; 还要检查params.inspect 的参数,因为assigneetask 键之外。
  • 我在顶部初始化了var assignee
  • 这是另一个问题,与主要问题Ajax Bad Request 400 Rails无关。 1 个问题 => 1 个答案这就是 stackoverflow 的工作原理。
  • 是的,我知道,但问题仍然悬而未决。它不起作用,但感谢您的建议。
【解决方案2】:

解决了!

    $( "#new_task" ).submit(function(event) {
    alert("form: "+assignee);
    var value = $('#new_task').find('input[name="task[value]"]').val();
event.preventDefault();
 $.ajax({
   url: "/tasks",
   type: "post",
   contentType: "application/json",

   data: JSON.stringify({ assignee: assignee, value: value }),
   success: function(data) {
       alert('successfully');
   },
   error: function(xhr, textStatus, error) {
     alert(xhr.statusText+" "+textStatus+" "+error);
   }
});

});

event.preventDefault(); --> 没有这个,表单会提交两次。

var value = $('#new_task').find('input[name="task[value]"]').val(); --> 如果没有这个,我可能会因为“发布任务”提醒任务#create 而丢失我的表单值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2019-01-12
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多