繁体   English   中英

Ruby on Rails中未定义的方法“ update_attributes”

[英]undefined method `update_attributes' in ruby on rails

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

未定义的方法“ 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” =>“ put”,“ authenticity_token” =>“ Yk26LKrW9ulRVV6p8GWhqTP7coSg96JiAmU4CUYYFugBgTDR2iRZZlyY1SQ7TbA7B2YVmgulgcWTosXvjnPXZcept =”“”“

我如何找到解决方案?

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

采用:

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

要么

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

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

并请注意 ,update_attributes消耗要更新的“ field:value”对({field_1_name:field_1_value,field_2_name:field_2_value})对的哈希,而不是仅包含一个Applied_id。

你行

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

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

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

继续我们的评论

我不确定实际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

问题是您要更新的collectionwhere )没有可用的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM