Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在更新属性时检测Rails 4中是否只更新了一个属性_Ruby On Rails_Ruby On Rails 4_Updates_Update Attributes - Fatal编程技术网

Ruby on rails 在更新属性时检测Rails 4中是否只更新了一个属性

Ruby on rails 在更新属性时检测Rails 4中是否只更新了一个属性,ruby-on-rails,ruby-on-rails-4,updates,update-attributes,Ruby On Rails,Ruby On Rails 4,Updates,Update Attributes,我正在制作一个博客应用程序。我需要有两种不同的方法,根据改变了多少属性。本质上,如果只有出版日期改变,我会做一件事……甚至出版日期和其他任何事情都会改变,我会做另一件事 posts\u controller.rb def special_update if #detect change of @post.publication_date only #do something elsif # @post changes besides publication_date elsi

我正在制作一个博客应用程序。我需要有两种不同的方法,根据改变了多少属性。本质上,如果只有出版日期改变,我会做一件事……甚至出版日期和其他任何事情都会改变,我会做另一件事

posts\u controller.rb

def special_update
  if #detect change of @post.publication_date only
    #do something
  elsif # @post changes besides publication_date
  elsif #no changes
  end
end

实现这一点的一种方法是在模型中使用提供的方法,该方法可用于所有Rails模型。特别是,更改后的方法非常有用:

model.changed # returns an array of all attributes changed. 
在Post模型中,您可以使用更新后的
或更新前的
回调方法来执行脏工作

class Post < ActiveRecord::Base
  before_update :clever_method

  private 
  def clever_method
    if self.changed == ['publication_date'] 
      # do something 
    else 
      # do something else 
    end
  end
end
class Post
实现这一点的一种方法是在模型中使用提供的方法,该方法适用于所有Rails模型。特别是,更改后的方法非常有用:

model.changed # returns an array of all attributes changed. 
在Post模型中,您可以使用更新后的
或更新前的
回调方法来执行脏工作

class Post < ActiveRecord::Base
  before_update :clever_method

  private 
  def clever_method
    if self.changed == ['publication_date'] 
      # do something 
    else 
      # do something else 
    end
  end
end
class Post
craig.kaminsky的答案是好的,但是如果你更喜欢弄乱你的控制器而不是模型,你也可以这样做:

def special_update
  # the usual strong params thing
  param_list = [:title, :body]
  new_post_params = params.require(:post).permit(*param_list)

  # old post attributes
  post_params = @post.attributes.select{|k,v| param_list.include(k.to_sym)}

  diff = (post_params.to_a - new_post_params.to_a).map(&:first)

  if diff == ['publication_date']
    #do something
  elsif diff.empty? # no changes
  else # other changes
  end
end

craig.kaminsky的答案是好的,但是如果你更喜欢弄乱你的控制器而不是你的模型,你也可以这样做:

def special_update
  # the usual strong params thing
  param_list = [:title, :body]
  new_post_params = params.require(:post).permit(*param_list)

  # old post attributes
  post_params = @post.attributes.select{|k,v| param_list.include(k.to_sym)}

  diff = (post_params.to_a - new_post_params.to_a).map(&:first)

  if diff == ['publication_date']
    #do something
  elsif diff.empty? # no changes
  else # other changes
  end
end

或者简单地将参数与现有值进行比较

if params[:my_model][:publication_date] != @my_model.publication_date
  params[:my_model][:publication_date] =  Time.now
end

或者简单地将参数与现有值进行比较

if params[:my_model][:publication_date] != @my_model.publication_date
  params[:my_model][:publication_date] =  Time.now
end

您可以只测试:self.changed=['publication\u date']您可以只测试:self.changed==['publication\u date']