【问题标题】:Ajax request causing "param is missing or the value is empty" errorAjax 请求导致“参数丢失或值为空”错误
【发布时间】:2014-06-16 08:18:32
【问题描述】:

好的,在我修复了this issue 之后,现在我有了这个新的,我似乎不明白。

这是我的观点和 Javascript 代码:

<script language="javascript" type="text/javascript">

function getConfig(){
$.ajax({
    url: "<%= get_config_projects_url %>",
    data: {
        id: <%= @project.id %>,
        unit_mgt_address: $('.unit_mgt_address_class').val(),
    }
});
}

</script>

<%= form_for(@project) do |f| %>
  <input type=button onClick="getConfig()"/>
  <div class="field">
    <%= f.label :Unit Management Address %><br>
    <%= f.text_field :UnitMgtAddress, :class=>'unit_mgt_address_class' %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

我的控制器

class ProjectsController < ApplicationController
  before_action :set_project, only: [:show, :edit, :update, :destroy]

  <many other methods go here>

  # GET /projects/1
  # GET /projects/1.json
  def get_config

    @project = Project.find(params[:id])

    respond_to do |format|
      if @project.update(project_params)
        format.js
        format.html { render action: "edit", notice: 'Project Get_Config Successful!' }
      else
        format.html { render action: "update" }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end
    end
  end

  private

  # Use callbacks to share common setup or constraints between actions.
  def set_project
    @project = Project.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def project_params
    params.require(:project).permit(:UnitMgtAddress)
  end
end

当我点击“刷新”按钮时,我收到以下错误消息:

Started GET "/projects/get_config?id=9&unit_mgt_address=5.5.5.5" for 127.0.0.1 at 2014-04-29 22:48:37 -0700
Processing by ProjectsController#get_config as */*
  Parameters: {"id"=>"9", "unit_mgt_address"=>"5.5.5.5"}
  Project Load (1.0ms)  SELECT  "projects".* FROM "projects"  WHERE "projects"."id"= ? LIMIT 1  [["id", 9]]
Completed 400 Bad Request in 6ms

ActionController::ParameterMissing (param is missing or the value is empty: project):
  app/controllers/projects_controller.rb:128:in `project_params'
  app/controllers/projects_controller.rb:91:in `block in get_config'
  app/controllers/projects_controller.rb:89:in `get_config'


  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.1.0/lib/action_dispatch/middleware/templates/rescues/_source.erb (2.0ms)
  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.1.0/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb (1.0ms)
  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.1.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb (1.0ms)
  Rendered C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/actionpack-4.1.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb (63.0ms)

我尝试了很多方法通过 Javascript 将 ":project" 参数传递给控制器​​,但我没有运气。

有什么帮助吗?

感谢和最好的问候

更新 1 根据要求,这些是我为 get_config 和 set_config 方法添加的路由

resources :projects do
  collection do
    get :get_config
    get :set_config
  end
end

工作解决方案 1

这是对我有用的代码更改:我将按钮移到表单外并替换为以下内容

<%= button_to 'Get Config', get_config_projects_url(id: @project.id, project: { unit_mgt_address: @project.UnitMgtAddress }), remote: true, method: :get %>

工作解决方案 2(解决方法)

function getConfig(){
    $.ajax({
        url: "<%= get_config_projects_url(project: { id: @project.id, unit_mgt_address: @project.UnitMgtAddress }) %>",
        data: {
            id: <%= @attero.id %>,
            unit_mgt_address: $('.unit_mgt_address_class').val(),
        }

    });
}

【问题讨论】:

  • 您可以发布您为此操作配置的路线吗?
  • @subvertallchris :感谢收看。我将“更新 1”下的路线添加到我的问题中。

标签: javascript ruby-on-rails ajax scaffolding


【解决方案1】:

对于多年后观看此内容的任何人。 我认为您需要在数据下放置一个“项目”对象参数以包含您的预期参数。对于其他任何人,它是对象名称(:page、:person 等)

Rails 期望在其控制器中实现这一点。

所以;

data: {
  project: {
    id: <%= @attero.id %>,
    unit_mgt_address: $('.unit_mgt_address_class').val()
  }    
}

【讨论】:

  • 非常感谢。简单,正是我所忽略的。立即解决了我的问题。
【解决方案2】:

您真的应该让 Rails 为您处理 AJAX 请求。我会将该按钮拉出正在提交的表单并将其放入自己的link_tobutton_to,如果您想使用按钮,只需添加method: :get。设置remote: true,它会为你处理所有的AJAX工作。

<%= link_to 'Get Config', get_config_projects_url(@project.id, project: { unit_mgt_address: @project.UnitMgtAddress }), remote: true %>

<%= button_to 'Get Config', get_config_projects_url(@project.id, project: { unit_mgt_address: @project.UnitMgtAddress }), remote: true, method: :get %>

可能需要稍微调整语法,特别是针对您的路径,但让 Rails 管理这类事情比您尝试做的要干净得多。阅读 button_to here 的语法。

【讨论】:

  • 感谢您的建议。我尝试了它,并且在进行微小更改后,它在一定程度上起作用,如“工作解决方案”部分下我的问题的更新所示。现在,我需要弄清楚如何用这个解决方案替换我的其余 Javascript 代码。感谢您的帮助。
  • 太棒了!您针对单个项目运行get_config,对吗?如果是这样,你的理想路径应该是yoursite/projects/1/get_config,所以你的路径应该是member do,而不是collection do
  • 事实上,这个解决方案并没有真正做到我想要的。我的表单充满了按钮和输入字段,我想在用户每次按下按钮或更改某些输入时调用 get_config,并且在表单外使用一个按钮来执行此操作对我来说并不真正有效。我仍在寻找一种更好的方法来从表单中的不同位置调用 get_config,更接近我的原始设计。
  • 所以你有一个包含多个按钮的表单,所有按钮都对 get_config 操作进行 AJAX 调用?而get_config会根据表单中输入的字段返回对现有页面的更新?
  • YES,get_config 也可以根据一些输入变化被调用,不仅仅是按钮点击
【解决方案3】:

这行得通吗?

data: {
    "id": <%= @project.id %>,
    "project[UnitMgtAddress]": $('.unit_mgt_address_class').val(),
}

【讨论】:

  • 感谢您的及时回复。如服务器日志所示,“id”和“unit_mgt_address”通过正常。我无法工作的是 params.require(:project).permit(:UnitMgtAddress) 所需的“:project”
  • 你注意到我在“UnitMgtAddress”之前添加了一个“项目”,然后用“[]”将它包裹起来了吗?所以还是不行?
  • 再次感谢。我尝试了您的建议,它给了我相同的结果和相同的错误消息。
  • @RaymondLiu :我注意到您的更改并尝试了它们,它们返回的错误完全相同
  • @Rich:感谢您的建议。我再次回答雷蒙德。我希望现在很清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多