class Detour::FlagForm
Public Class Methods
new(flaggable_type)
click to toggle source
# File lib/detour/flag_form.rb, line 2 def initialize(flaggable_type) @flaggable_type = flaggable_type.classify.constantize end
Public Instance Methods
errors?()
click to toggle source
# File lib/detour/flag_form.rb, line 10 def errors? features.any? { |feature| feature.errors.any? } end
features()
click to toggle source
# File lib/detour/flag_form.rb, line 6 def features @features ||= Detour::Feature.includes("#{flaggable_collection}_percentage_flag", "#{flaggable_collection}_database_group_flags", "#{flaggable_collection}_defined_group_flags").with_lines end
group_flags_for(feature, types = %w[defined database])
click to toggle source
# File lib/detour/flag_form.rb, line 18 def group_flags_for(feature, types = %w[defined database]) Array.wrap(types).inject([]) do |flags, type| flags.concat _group_flags_for(feature, type) end.sort_by do |flag| flag.group.name.downcase end end
groups()
click to toggle source
# File lib/detour/flag_form.rb, line 14 def groups @groups ||= (database_groups + defined_groups).sort_by { |group| group.name.downcase } end
update_attributes(params)
click to toggle source
# File lib/detour/flag_form.rb, line 26 def update_attributes(params) Detour::Feature.transaction do |transaction| features.map do |feature| feature_params = params[:features][feature.name] next unless feature_params check_percentage_flag_for_deletion(feature, feature_params) process_group_flags(feature, feature_params) feature.assign_attributes feature_params feature.save if feature.changed_for_autosave? end if features.any? { |feature| feature.errors.any? } raise ActiveRecord::Rollback else true end end end
Private Instance Methods
_group_flags_for(feature, type)
click to toggle source
# File lib/detour/flag_form.rb, line 49 def _group_flags_for(feature, type) send("#{type}_groups").map do |group| flags = feature.send("#{flaggable_collection}_#{type}_group_flags") if flag = flags.detect { |flag| flag.group.id == group.id } next flag else if type == "database" flags.new(group_id: group.id) else flags.new(group_name: group.name) end end end end
check_percentage_flag_for_deletion(feature, params)
click to toggle source
# File lib/detour/flag_form.rb, line 64 def check_percentage_flag_for_deletion(feature, params) key = :"#{flaggable_collection}_percentage_flag_attributes" flag = feature.send("#{flaggable_collection}_percentage_flag") flag_params = params[key] if flag.present? && flag_params[:percentage].blank? feature.send("#{flaggable_collection}_percentage_flag").mark_for_destruction feature.send("#{flaggable_collection}_percentage_flag=", nil) end if flag.present? && flag_params[:percentage].to_i == flag.percentage params.delete key end end
database_groups()
click to toggle source
# File lib/detour/flag_form.rb, line 79 def database_groups @database_groups ||= Detour::Group.where(flaggable_type: @flaggable_type) end
defined_groups()
click to toggle source
# File lib/detour/flag_form.rb, line 83 def defined_groups @defined_groups ||= begin (Detour::DefinedGroupFlag.where(flaggable_type: @flaggable_type).map { |flag| flag.group } + Detour::DefinedGroup.by_type(@flaggable_type).values).uniq(&:name) end end
flaggable_collection()
click to toggle source
# File lib/detour/flag_form.rb, line 91 def flaggable_collection @flaggable_type.table_name end
process_group_flags(feature, params)
click to toggle source
# File lib/detour/flag_form.rb, line 95 def process_group_flags(feature, params) %w[defined database].each do |type| key = :"#{flaggable_collection}_#{type}_group_flags_attributes" flags_params = params[key] || {} params.delete key group_flags_for(feature, type).each do |flag| flag.keep_or_destroy(flags_params[flag.group_name]) end end end