ruby-on-rails - 仅当属性已更改时才更新用户的属性

标签 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


但这行不通。现在发生的事情是,在编辑页面上,如果我不更改任何信息并点击提交,则什么也没有发生(很好),但是,如果我更改信息并点击提交,则仍然没有任何结果(不好)。我究竟做错了什么?

注意:我最初认为这是一个操作顺序错误,所以我将其设置为嵌套,首先是@ request.update_attributes,然后是@ request.changed,但这是行不通的...

最佳答案

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

关于ruby-on-rails - 仅当属性已更改时才更新用户的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21297506/

相关文章:

sql - 范围 : Sort by difference between two dates

mysql - Rails 关联多个字符串外键

ruby-on-rails - 如何将 Bitbucket 存储库添加到 jenkins?

ruby-on-rails - 参数数量错误 [ex :(3 for 2)] in methods [but only pass 2]

ruby-on-rails - 基于环境的 Capistrano deploy.rb 文件

javascript - Rails 4 使用回形针预览嵌套表单图像

ruby-on-rails - Rails4 + 回形针 : Url and Path not matching

ruby-on-rails - 从 ruby​​ gem 加载 rake 任务

ruby-on-rails - Rails 3.0.9 + Ruby 1.9.2 p180 + Devise - 路线

css - Sass::静态页面中的语法错误#home Hartel 的教程