Ticket #508: page_controller_refactor.diff

File page_controller_refactor.diff, 3.7 kB (added by igotimac, 1 year ago)
  • app/models/page_part.rb

    old new  
    1515  object_id_attr :filter, TextFilter 
    1616   
    1717end 
     18 
     19module PagePart::AssociationExtension 
     20 
     21  def [](index) 
     22    if index.is_a? String 
     23      self.each do |part| 
     24        if part.name == index 
     25          return part 
     26        end 
     27      end 
     28      return nil 
     29    else 
     30      super 
     31    end 
     32  end 
     33 
     34  def update_association(params) 
     35    original_names = self.map { |part| part.name } 
     36    submited_part_names = (params[:part] || {}).values.map { |part| part[:name] } 
     37    names_to_remove = (original_names - submited_part_names) 
     38     
     39    submited_part_names.each_with_index do |name, index| 
     40      v = params[:part].values[index] 
     41      part = self[name] 
     42      if part.nil? 
     43        #create new part 
     44        new_part = PagePart.new; 
     45        new_part.attributes = v;         
     46        self << new_part 
     47      else 
     48        #update exisiting part 
     49        part.attributes = part.attributes.merge( v ) 
     50      end 
     51    end 
     52 
     53    names_to_remove.each { |name| delete( self[name] ) } 
     54  end 
     55   
     56  def save 
     57    self.each do |part| 
     58      part.save 
     59    end 
     60  end 
     61     
     62end 
  • app/models/page.rb

    old new  
    99   
    1010  # Associations 
    1111  acts_as_tree :order => 'virtual DESC, title ASC' 
    12   has_many :parts, :class_name => 'PagePart', :order => 'id', :dependent => :destroy 
     12  has_many :parts, :class_name => 'PagePart', :order => 'id', :dependent => :destroy,  
     13    :extend => PagePart::AssociationExtension 
     14   
    1315  belongs_to :_layout, :class_name => 'Layout', :foreign_key => 'layout_id' 
    1416  belongs_to :created_by, :class_name => 'User', :foreign_key => 'created_by' 
    1517  belongs_to :updated_by, :class_name => 'User', :foreign_key => 'updated_by' 
     
    8385    end 
    8486  end 
    8587   
     88  def update_associations_each 
     89    Page.reflect_on_all_associations.each do 
     90      |relation| 
     91      association = self.send(relation.name) 
     92      if association.respond_to?( :update_association ) 
     93        yield association 
     94      end 
     95    end 
     96  end 
     97   
     98  def update_associations(params) 
     99    update_associations_each do |association| 
     100      association.update_association(params) 
     101    end 
     102  end 
     103   
     104  def save 
     105    if result = super 
     106      update_associations_each do |association| 
     107        association.save 
     108      end 
     109    end 
     110    result 
     111  end 
     112   
    86113  def process(request, response) 
    87114    @request, @response = request, response 
    88115    if layout 
  • app/controllers/admin/page_controller.rb

    old new  
    9292    end 
    9393     
    9494    def save 
    95       parts = @page.parts 
    96       parts_to_update = {} 
    97       (params[:part]||{}).each {|k,v| parts_to_update[v[:name]] = v } 
    98        
    99       parts_to_remove = [] 
    100       @page.parts.each do |part| 
    101         if(attrs = parts_to_update.delete(part.name)) 
    102           part.attributes = part.attributes.merge(attrs) 
    103         else 
    104           parts_to_remove << part 
    105         end 
    106       end 
    107       parts_to_update.values.each do |attrs| 
    108         @page.parts.build(attrs) 
    109       end 
    110       if result = @page.save 
    111         new_parts = @page.parts - parts_to_remove 
    112         new_parts.each { |part| part.save } 
    113         @page.parts = new_parts 
    114       end 
    115       result 
     95      @page.update_associations(params) 
     96      @page.save 
    11697    end 
    11798     
    11899    def clear_model_cache