在ruby on rails中未定义的方法'update_attributes'

cpjpxq1n  于 2023-05-06  发布在  Ruby
关注(0)|答案(5)|浏览(107)

这个更新过程有些不同,我需要更新查询里面的循环,但显示这个错误:
undefined方法`update_attributes '
这是代码:

<%= link_to "Accept", apply_path(accept:{:accept => 1}), :method => :put, class: "btn btn-success" %>

控制器:

def update
  @accept = Applied.where(params[:applied_id])
  params.permit!
  if @accept.update_attributes(params[:applied_id])
    #flash[:notice] = "updated"
    render 'apply'
  else
    render 'apply'
  end
end

请求参数:
Copyright © 2018 - 2019 www.jsjs.com All Rights Reserved.粤ICP备15048888号-1
如何找到解决方案?

rkkpypqq

rkkpypqq1#

您只能为单个模型示例(记录)调用update_attributes,而不能为ActiveRecord::Relation对象(它类似于记录数组)调用。
用途:

@accept = Applied.where({applied_id:params[:applied_id]}).first

@accept = Applied.find(params[:applied_id])

请注意,如果您没有其他配置,find会在model表的id字段中查找您的applied_id。
请注意update_attributes会消耗您想要更新的“field:value”对({field_1_name:field_1_value,field_2_name:field_2_value})的散列,而不仅仅是单个applied_id。

qvk1mo1f

qvk1mo1f2#

优行

@accept = Applied.where(params[:applied_id])

返回一个ActiveRecord关系,它显然没有方法update_attributes。要获取单个记录,请使用firstfind

@accept = Applied.find(params[:applied_id])
lvjbypge

lvjbypge3#

继续我们的评论。
我不知道实际上accept是什么,实际上你想做什么specically,但是,就像我的理解,尝试更新您的链接href。它应该看起来像:

apply_path(accept:{:accept => 1, applied_id: YOUR_APPLIED_ID})

更新您的操作如下:

def update
  accept = params[:accept] # Recommendation: you should use strong parameter
  @accept = Applied.where(accept[:applied_id])
  params.permit!
  @accept.update_attributes(accept)

  render 'apply' # You don't need any condition, as you are rendering same template in every case.
end
z9smfwbn

z9smfwbn4#

问题是您正在尝试更新一个没有可用的update_attributes方法的collectionwhere)。
你需要的是.find

def update
  @accept = Applied.find params[:applied_id]
  @accept.update applied_params
  render 'apply'
end

private

def applied_params
  params.require(:accept).permit(:accept)
end
  • 但是 *,您没有传递任何applied_id参数(因此find将无法工作);您需要使用以下路线:
#config/routes.rb
resources :applied do
   put :apply, action: :update #-> url.com/applied/:applied_id/apply
end

<%= link_to "Accept", apply_path([[[applied.id]]], accept:{:accept => 1}), :method => :put, class: "btn btn-success" %>

更好的方法是使用button_to

<%= button_to "Accept", apply_path([[applied_id]]), method: :put, params: {accept: 1} %>

如果你使用上面的方法,你必须在你的控制器中改变你的params方法。

如果你想使用.where(用于多条记录),你需要使用update_all

def update
  @accept = Applied.where id: params[:applied_id]
  @accept.update_all applied_params
  render 'apply'
end

private

def applied_params
  params.require(:accept).permit(:accept)
end
avwztpqn

avwztpqn5#

如果您在Rails 6之后发现此错误,则是因为update_attributes已被弃用,并已简单地替换为update per https://github.com/rails/rails/pull/8705
更新电话直接为我解决了问题。

相关问题