Rails中的DRY控制器3.2

时间:2012-10-11 00:41:54

标签: ruby ruby-on-rails-3 dry

在进行代码气候分析后,我发现我的控制器并非干燥。 方法如:

   def index
    @animals = current_user.animals.valid_animals.search(params[:search], params[:page])
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @animals }
    end   
 end

在所有控制器中基本相同。

基本上,脚手架导轨生成的代码在所有控制器中都是“相同的”。 我怎样才能以一种真正好的方式使它变得更干净和干燥?

提前致谢

3 个答案:

答案 0 :(得分:11)

无需按照您所述的方式制作代码DRY。考虑一下,使代码DRY的主要目的之一是,如果您在一个地方更新代码,则不必在其他地方更新代码。但是,在您的情况下,如果您在Controller X中更新代码,那么您在Controller Y中进行相同更改的可能性有多大?如果不是,那么它不是抽象的好候选者。 (事实上​​,如果你甚至想在X中远程改变一些不会影响Y的东西,那么它对于DRY-ness来说是一个糟糕的候选者)

一般来说,抽象是好的。但是,过度抽象不是一件好事,应该避免。

答案 1 :(得分:3)

您可以使用respond_with进行这些操作。

class AnimalController < ApplicationController
  respond_to :html, :json

  def index
    @animals = current_user.animals.valid_animals.search(params[:search], params[:page])
    respond_with @animals
  end   
end

答案 2 :(得分:2)

Ken Li是对的,过度抽象不是一件好事,在这种情况下有点不必要,但如果你的控制器中有重复的代码,你可以使用Before, Around and After filters来干掉代码。