未定义的方法`update_attributes'在轨道上的红宝石

时间:2016-01-29 06:09:32

标签: ruby-on-rails ruby ruby-on-rails-4

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

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

请求参数:

{&#34; _method&#34; = GT;&#34;把&#34 ;,  &#34; authenticity_token&#34; = GT;&#34; Yk26LKrW9ulRVV6p8GWhqTP7coSg96JiAmU4CUYYFugBgTDR2iRZZlyY1SQ7TbA7B2YVmgulgcWTosXvjnPXZw ==&#34 ;,  &#34;接受&#34; = GT; {&#34;接受&#34; = GT;&#34; 1&#34;}}

我如何找到解决方案?

4 个答案:

答案 0 :(得分: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使用&#34;字段:值&#34;的哈希值要更新的对({field_1_name:field_1_value,field_2_name:field_2_value}),而不仅仅是一个applied_id。

答案 1 :(得分:0)

你排队

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

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

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

答案 2 :(得分:0)

继续我们的comments

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

答案 3 :(得分:0)

问题是您正在尝试更新没有collection方法的whereupdate_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