trabajo-afectivo/app/models/application_model/can_cleanup_param.rb

91 lines
2.2 KiB
Ruby
Raw Normal View History

# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
module ApplicationModel::CanCleanupParam
extend ActiveSupport::Concern
# methods defined here are going to extend the class, not the instance of it
class_methods do
=begin
remove all not used model attributes of params
result = Model.param_cleanup(params)
for object creation, ignore id's
result = Model.param_cleanup(params, true)
returns
result = params # params with valid attributes of model
=end
def param_cleanup(params, new_object = false)
2017-09-08 08:28:34 +00:00
if params.respond_to?(:permit!)
params = params.permit!.to_h
end
if params.nil?
raise ArgumentError, "No params for #{self}!"
end
data = {}
params.each do |key, value|
data[key.to_sym] = value
end
# ignore id for new objects
if new_object && params[:id]
data.delete(:id)
end
# only use object attributes
clean_params = {}
2017-11-23 08:09:44 +00:00
new.attributes.each_key do |attribute|
next if !data.key?(attribute.to_sym)
# check reference records, referenced by _id attributes
reflect_on_all_associations.map do |assoc|
class_name = assoc.options[:class_name]
next if !class_name
name = "#{assoc.name}_id".to_sym
next if !data.key?(name)
next if data[name].blank?
next if assoc.klass.lookup(id: data[name])
raise ArgumentError, "Invalid value for param '#{name}': #{data[name].inspect}"
end
clean_params[attribute.to_sym] = data[attribute.to_sym]
end
# we do want to set this via database
filter_unused_params(clean_params)
end
private
=begin
remove all not used params of object (per default :updated_at, :created_at, :updated_by_id and :created_by_id)
result = Model.filter_unused_params(params)
returns
result = params # params without listed attributes
=end
def filter_unused_params(data)
# we do want to set this via database
2017-11-23 08:09:44 +00:00
%i[action controller updated_at created_at updated_by_id created_by_id updated_by created_by].each do |key|
data.delete(key)
end
data
end
end
end