仅在属性更改时更新User的属性

时间:2014-01-23 01:19:59

标签: ruby-on-rails

我项目的原创,愉快工作版本看起来像这样:

1)用户填写表格(新动作)并点击提交(创建动作)

2)用户被重定向到他们的编辑页面(编辑操作使用由模型创建的edit_id,而不是Rails自动生成ID),这显示了用户已经提交的信息

3)用户可以选择更改信息(更新操作)并重新提交

在此版本中,即使用户在编辑页面中没有更改任何内容并提交,该页面仍会闪烁成功警报。

从数据库的角度来看,我并不在意,因为表单预先填充了用户的信息,update_attributes方法只是用相同的信息覆盖旧信息。

从用户的角度来看,它很烦人,所以我想确保只更新信息,并且只有当用户实际更改某些内容时才会闪烁成功警报。

我认为这很容易,改变旧代码:

def update
  @request = Request.find_by_edit_id(params[:edit_id])
  if @request.update_attributes(request_params) 
    flash[:success] = true
    redirect_to edit_request_path(@request.edit_id)
  else
    render 'edit'
  end
end

并在“if”中添加一个额外的组件:

def update
  @request = Request.find_by_edit_id(params[:edit_id])
  if @request.update_attributes(request_params) && @request.changed?
    flash[:success] = true
    redirect_to edit_request_path(@request.edit_id)
  else
    render 'edit'
  end
end

但这不起作用。现在发生的是,在编辑页面上,如果我没有更改任何信息并点击提交,没有任何事情发生(这很好),但如果我改变信息并点击提交,仍然没有任何反应(这是不好的)。我做错了什么?

注意:我最初认为这是一个操作错误的顺序,所以我把它作为嵌套的if,首先是if @ request.update_attributes,第二个if @ request.changed,但这不起作用......

1 个答案:

答案 0 :(得分:24)

update_attributes方法包含'save'调用作为其方法的一部分,如果保存成功则返回true。我认为您正在使用assign_attributes寻找类似的内容:

def update
  @request = Request.find_by_edit_id(params[:edit_id])
  @request.assign_attributes(request_params)

  if @request.changed?
    if @request.save
      flash[:success] = true
      redirect_to edit_request_path(@request.edit_id)
    else
      render 'edit'
    end
  else
    # Action if no change has been made
  end
end