升级到Rails 5之后,我遇到了jQuery .ajax请求的问题。 我相信这与(有些)新的强大参数有关。 我收到以下错误:

ArgumentError (When assigning attributes, you must pass a hash as an argument.):

我想我在我的.ajax请求中错误地设置了我的数据包(使用Coffeescript)。

或者可能是我的可信参数无法正常工作。

使用byebug,看起来我的控制器的第一行是可以的,但它在第二行失败: @prospect.update(prospect_params[:status]) 这是byebug中的@_params变量:

1: @_params = <ActionController::Parameters {"prospect"=><ActionController::Parameters {"id"=>"16", "status"=>"inactive"} permitted: false>, "controller"=>"prospects", "action"=>"update_status"} permitted: false>

这是我的控制器和Coffescript的片段

调节器

  # PUT /prospects/update_status
  def update_status
    @prospect = Prospect.find(params[:id])
    @prospect.update(prospect_params[:status])

    respond_to do |format|
      if @prospect.update_attributes(prospect_params)
        format.json { head :no_content }
      else
        format.json { render json: @prospect.errors, status: :unprocessable_entity }
      end
    end
  end

...

  private
  # Use callbacks to share common setup or constraints between actions.
  def set_prospect
    @prospect = Prospect.find(params[:id])
  end

  # Only allow a trusted parameter "white list" through.
  def prospect_params
    params.require(:prospect).permit(:name, :status, :priority, :id)
  end

CoffeeScript的

    # Update prospects active list when a toggle switch is clicked
    $("#prospects_list").on "change", ".js-switch", ->
        prospect_id = $(this).parent('form').find('input[name="prospect[id]"]').val()
        if @checked
            status = 'active'
        else
            prospect_status = 'inactive'
        # Get parent TR
        tr = $(this).closest('tr')
        # Update prospect using Ajax
        $.ajax
            url: '/prospects/update_status'
            type: 'POST'
            data: { prospect: {id: prospect_id, status: prospect_status } }
            dataType: 'json'
            success: (data) ->
                return
            false

===============>>#1 票数:3

您传递参数的值。

查看you must pass a hash as an argument.的错误消息you must pass a hash as an argument.

@prospect.update(prospect_params[:status])
# here is you pass a value of status key, that's not a hash
# {"id"=>"16", "status"=>"inactive"} 
# prospect_params[:status] => "inactive"

使用只:

@prospect.update(prospect_params)
# that's pass a hash
# prospect_params => {"id"=>"16", "status"=>"inactive"}

要么:

@prospect.update(status: prospect_params[:status])

===============>>#2 票数:0

首先问自己是否确实需要一个特定的路由来更新状态,或者这应该是对规范更新路由的请求:

PATCH /prospects/:id

在这种情况下,您应该更改您的AJAX处理程序:

# Update prospects active list when a toggle switch is clicked
$("#prospects_list").on "change", ".js-switch", ->
    prospect_id = $(this).parent('form').find('input[name="prospect[id]"]').val()
    if @checked
      status = 'active'
    else
      prospect_status = 'inactive'
    # Get parent TR
    tr = $(this).closest('tr')
    # Update prospect using Ajax
    $.ajax
      url: '/prospects/' + prospect_id
      type: 'PATCH' # Not POST!
      data: { prospect: { status: prospect_status } }
      dataType: 'json'
      success: (data) ->
          return
      false

如果由于某种原因想要一个特定的方法,你可以通过将:id移动到路径而不是params来修复它。

# config/routes.rb
resources :prospects do
  member do
    patch :update_status
  end
end

# PATCH /prospects/:id/update_status
def update_status
  @prospect = Prospect.find(params[:id])
  respond_to do |format|
    if @prospect.update_attributes(prospect_params)
      format.json { head :no_content }
    else
      format.json { render json: @prospect.errors, status: :unprocessable_entity }
    end
  end
end

# ...

def prospect_params
  params.require(:prospect).permit(:name, :status, :priority)
end

# coffeescript
url: '/prospects/' + prospect_id  +'/update_status'

使用@prospect.update(prospect_params[:status])两次更新记录并绕过强参数,以便引发异常。

===============>>#3 票数:0 已采纳

感谢Зелёный和max让我朝着正确的方向前进。 这就是我用过的东西。 我只需要对控制器进行一些小改动

调节器

# PUT /prospects/update_status
def update_status
  @prospect = Prospect.find(prospect_params[:id])
  respond_to do |format|
    if @prospect.update(status: prospect_params[:status])
      format.json { head :no_content }
    else
      format.json { render json: @prospect.errors, status: :unprocessable_entity }
    end
  end
end

  ask by Ryan translate from so

未解决问题?本站智能推荐:

1回复

不可用于ajax的js在Rails中出现了元素

例如,我有一个随ajax请求一起出现的表单字段,它具有类can_be_deleted 。 同时,我有一些已经存在的元素随页面加载出现,它们还具有can_be_deleted类。 当按下带有该类的元素时,绑定的coffescript适用于ajax创建的所有元素(EXCEPT除外)。
1回复

Rails 5如何从咖啡脚本文件获取Ajax api调用的响应到Rails视图

在我的movies.coffee文件中,我有这段代码正在进行ajax调用以获取电影列表。 然后,我想从调用中获取json响应,将其放入某种ruby对象中,然后我可以循环遍历该对象,并将其内容显示在多张引导卡的movie.index.html.erb页面上。 例如进入@movies实
3回复

Rails远程表单成功,但不返回任何数据

我有一个简单的远程表单,带有一个输入和发送按钮。 我为ajax创建了监听器:success: 而我的控制器: 我看到请求在后端传递,并返回状态200: 但在devtools我看到: 我究竟做错了什么?
2回复

如何将在日期字段中键入数据限制为仅某些字符?

我正在创建一个Rails 5应用程序。 我有一个咖啡脚本文件,我想在其中创建一个函数,该函数通过输入数据来限制某人输入日期对象。 我希望表格像 但我希望此人只能输入数字(并使用箭头键来移动光标)。 我希望自动添加斜线。 我尝试创建这个 但是它有几个问题。 它将自动添加一
1回复

Rails AJAX jQuery POST-参数未通过且数据库未更新

我是Rails的新手,在尝试使用AJAX更新或发布到数据库时遇到了麻烦。 我在开发日志中看到以下代码查询数据库,但是数据没有作为参数传递给控制器​​操作,并且数据库也未更新,尽管我可以访问flascard_id ,“ yes”和下面通过jQuery发出“成功”警报。 user_flashc
2回复

不能使AJAX和JQuery在Rails中工作

我正在一个Rails项目上工作,尝试使用$ .post从服务器获取一些数据,但是没有任何反应。 有人看到错了吗? HTML文件 .js文件 routes.rb controller.rb
1回复

jQuery Ajax调用后,Rails视图未更新

我处于第一个Rails项目的中间,已经到达要根据SELECT标记的值更改模型索引的ORDER BY的阶段。 我的index.html.erb中有以下onchange 那应该更新: 这将在我的coffeescript资产中调用以下方法(由于是anon函数,因此带有@前缀):
1回复

jQuery自动完成无法在Rails中的Ajax加载形式内工作

在我的Rails应用程序中,我通过发送ajax请求来加载撰写邮件表单 我的compose.js文件的代码是 $('#main')。html(“ <​​%= j render:partial =>”邮件/表单“%>”); 现在在我的撰写表格中,我已经使用j
1回复

使用ajax,Rails,Coffeescript,jQuery更新列表中的记录

题 我有一个博客列表。 使用ajax,我单击“编辑”以编辑特定记录。 我编辑该记录,然后单击更新。 我仍然使用ajax淡入所有记录的列表-应该从记录列表中删除旧记录,而在其位置是具有新值的更新记录。 答:使用ajax在博客列表上执行Crud操作的代码,包括更新: blog
1回复

使用jQuery / Coffee AJAX Rails进行实时表单验证

Okey,所以我有这个问题。。。我已经有好几个星期了。 我正在做一个学校项目,应该使用Ruby on Rails和Ajax(jQuery / Coffee)进行实时表单验证。 我已经用谷歌搜索了,发现了很多插件,但是没有一个有用的教程。 我有一些似乎合法的代码,但是我需要帮助使此代码实时验