ruby on rails 中未定义的方法“update_attributes”

问题描述 投票:0回答:5

此更新过程有所不同我需要在循环内更新查询,但显示此错误:

未定义的方法`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

请求参数:

{"_method"=>"放", “authenticity_token”=>“Yk26LKrW9ulRVV6p8GWhqTP7coSg96JiAmU4CUYYFugBgTDR2iRZZlyY1SQ7TbA7B2YVmgulgcWTosXvjnPXZw==”, “接受”=>{“接受”=>“1”}}

我怎样才能找到解决方案?

ruby-on-rails ruby ruby-on-rails-4
5个回答
1
投票

您只能为单个模型实例(记录)调用 update_attributes,但不能为 ActiveRecord::Relation 对象(它就像一个记录数组)调用。

使用:

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

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

注意,如果您没有其他配置,请在模型表的 id 字段中查找您的 applied_id。

注意 update_attributes 消耗你想要更新的“字段:值”对({field_1_name:field_1_value,field_2_name:field_2_value})的散列,而不仅仅是一个applied_id。


0
投票

你行

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

返回一个显然没有方法

update_attributes
的ActiveRecord关系。要获取单个记录,请使用
first
find
代替:

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

0
投票

继续我们的评论.

我不确定

accept
到底是什么,以及您具体想要做什么,但是,根据我的理解,请尝试更新您的链接 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

0
投票

问题是您正在尝试更新没有可用的

collection
方法的
where
update_attributes
)。

你需要的是

.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

0
投票

如果您从 Rails 6 开始发现此错误,那是因为

update_attributes
已被弃用,并且已被简单地替换为
update
https://github.com/rails/rails/pull/8705.

更新电话直接解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.