Rails 3.2 使用 Rubycritic 进行重构

Rails 3.2 Refactoring With Rubycritic

我的 r_grids_controller.rb

中有此代码
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

使用 RubyCritic,它告诉我这 4 个块是 'DuplicateCode'。但是,我不知道如何重构它以使其保持干燥。

有人有想法吗? :-)

例如,您可以重复使用相同的部分并只调用方法,因此:

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

但最好只使用特定列表来保护或限制属性:%w(admin_email admin_call admin_offline onboarded),因此将其插入到方法的开头。

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

然后调用控制器:

update :onboarded