检测是否只有一个属性在 Rails 4 on update_attributes 中更新
detect if only one attribute is updated in Rails 4 on update_attributes
我正在制作一个博客应用程序。根据更改的属性数量,我需要两种不同的方法。本质上,如果只有 publication_date 发生变化,我会做一件事......即使 publication_date 和任何其他变化,我也会做另一件事。
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_update
或 before_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
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
我正在制作一个博客应用程序。根据更改的属性数量,我需要两种不同的方法。本质上,如果只有 publication_date 发生变化,我会做一件事......即使 publication_date 和任何其他变化,我也会做另一件事。
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_update
或 before_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
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