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
我的 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