2016-04-26 2 views
0

Ich habe diesen Code in meinem r_grids_controller.rbRails 3.2 Refactoring Mit Rubycritic

before_filter -> {find_rgrid_by_user params[:user_id]}, only: [:update_admin_call, :update_admin_email, 
                  :update_admin_offline, :update_onboarded] 

......... 
def update_admin_email 
    old_admin_email = @rgrid.admin_email 
    @rgrid.update_attribute('admin_email', !old_admin_email) 
    respond_to do |format| 
    format.js { render 'update_checkbox', :locals => {:checkbox_name => "email_#{params[:user_id]}"}} 
    end 
end 

def update_admin_call 
    old_admin_call = @rgrid.admin_call 
    @rgrid.update_attribute('admin_call', !old_admin_call) 
    respond_to do |format| 
    format.js { render 'update_checkbox', :locals => {:checkbox_name => "call_#{params[:user_id]}"}} 
    end 
end 

def update_admin_offline 
    old_admin_offline = @rgrid.admin_offline 
    @rgrid.update_attribute('admin_offline', !old_admin_offline) 
    respond_to do |format| 
    format.js { render 'update_checkbox', :locals => {:checkbox_name => "offline_#{params[:user_id]}"}} 
    end 
end 

def update_onboarded 
    old_onboarded = @rgrid.onboarded 
    @rgrid.update_attribute('onboarded', !old_onboarded) 
    respond_to do |format| 
    format.js { render 'update_checkbox', :locals => {:checkbox_name => "onboarded_#{params[:user_id]}"}} 
    end 
end 

private 

def find_rgrid_by_user(user_id) 
    @rgrid = RGrid.find_by_user_id(user_id) 
end 

mit RubyCritic, sagt es mir, dass diese vier Blöcke sind 'DuplicateCode'. Ich weiß jedoch nicht, wie ich das umgestalten kann, um es trocken zu halten.

Jemand hat eine Idee? :-)

Antwort

0

Zum Beispiel können Sie die gleichen Teile wiederverwendet werden und nur die Methoden aufrufen, so:

def update attribute 
    old_value = @rgrid.send(attribute) 
    @rgrid.update_attribute(attribute, ! old_value) 
    respond_to do |format| 
    format.js { render 'update_checkbox', :locals => {:checkbox_name => "#{attribute}_#{params[:user_id]}"}} 
    end 
end 

Aber es ist besser zu schützen oder Attribute nur mit sepcified Liste einzuschränken: %w(admin_email admin_call admin_offline onboarded), so legen diese zu Beginn der Methode.

unless %i(admin_email admin_call admin_offline onboarded).include?(attribute) 
    raise 
end 

Rufen Sie dann in einem Controller:

update :onboarded 
+0

Wirklich, es ist perfekt! Haben Sie Vorschläge (Websites, Blogs, Artikel, ...), die mir helfen, diese Probleme zu überarbeiten, wie die Warnungen mit Rubycritic? Es wird sehr hilfreich sein für mein Lernen :) –