检测是否在Rails 4中只有一个属性在update_attributes上更新



我正在制作一个博客应用程序。我需要根据有多少属性被改变了两种不同的方法。本质上,如果只有publication_date改变,我做一件事…即使publication_date和ANYTHING ELSE改变了,我也做了另一件事。

posts_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

实现这一点的一种方法是在您的模型中使用ActiveModel::Dirty提供的方法,该方法可用于所有Rails模型。修改后的方法尤其有用:

model.changed # returns an array of all attributes changed. 

在Post模型中,您可以使用after_updatebefore_update回调方法来完成您的脏工作。

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

克雷格。卡明斯基的回答很好,但如果你更喜欢摆弄你的控制器而不是你的模型,你也可以这样做:

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

相关内容

  • 没有找到相关文章

最新更新