重构类似控制器的动作

时间:2014-03-01 13:37:10

标签: ruby-on-rails refactoring

我使用Pull Review来审核我的应用程序代码,然后又回来了:

  

考虑重构,检测到类似的代码。

     

发生在:

     

SkillsController #index

     

PagesController #index

所以app / controllers / skills_controller.rb索引操作代码是:

def index
  @skill = Skill.new
  if params[:search]
    @skills = Skill.search(params[:search]).order('created_at DESC')
  else
    @skills = Skill.all.order('created_at DESC')
  end
end

并且app / controllers / pages_controller.rb是:

def index
  @users = User.all
  if params[:search]
    @users = User.search(params[:search]).order('created_at DESC')
  else
    @users = User.all.order('created_at DESC')
  end
end

我是否想以某种方式在这两个控制器上重构这两个动作?另外,我不确定如何重构这个。我是否提取if params [:search]段并将实例变量替换为将在两个操作中使用的另一个变量?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

看看has_scope和inherited_resources。您可以使用has_scope提取params [:search]部分。并使用inherited_resources来提取如何获取集合并进行排序。

答案 1 :(得分:1)

我不知道您的方法search来自哪里。它似乎来自ActiveRecord的自定义模块/ gem。

如果是这样,您可以更改方法以缩短控制器中的代码

def self.search(args)
  return self unless args
  original_search_logic args
end

# As well as extract order to a scope
scope :by_time, -> { order('created_at DESC') }

然后在控制器中:

# Skill
def index
  @skills = Skill.search(params[:search]).by_time
end

# User
def index
  @users = User.search(params[:search]).by_time
end

现在这些应该足够干燥了。