Rails 4 - 如何优化此代码

Rails 4 - How to optimize this code

假设我有这段代码:

class BooksController < ApplicationController

    def action1
        @books = ...
        @books = @books.someaction param1, param2
    end

    def action2
        @books = ...
        @books = @books.someaction param1, param2
    end

    def action3
        @books = ...
        @books = @books.someaction param1, param2
    end

    ...

    def action84
        @books = ...
        @books = @books.someaction param1, param2
    end

我经常对实例变量执行此操作 运行。我想把它放在 after_action 过滤上,但那是在渲染之后发生的,所以那不好。

我该如何优化它?

免责声明:这是一个夸张的案例,并非真实案例。只是试图使问题更加形象化。我没有带 84 个动作的控制器。

只需在您的控制器中声明一个私有函数,然后在您的操作中使用它:

class BooksController < ApplicationController
  def action1
    @books = ...
    foo
  end

  def action2
    @books = ...
    foo
  end

  def action3
    @books = ...
    foo
  end

  ...

  def action84
    @books = ...
    foo
  end

  private

  def foo
    @books = @books.someaction param1, param2
  end
end

我会看看 decent_exposure gem。这应该允许你做类似的事情:

class BooksController < ApplicationController
    expose(:books) { books.someaction param1, param2 }

    def action1
        books = ...
    end

    def action2
        books = ...
    end

    def action3
        books = ...
    end

    ...

    def action84
        books = ...
    end
end

您可以覆盖 render 只是为了让特定控制器始终在渲染之前执行您的操作。像这样:

class BooksController < ApplicationController

  def action1
    @books = ...
  end

  def action2
    @books = ...
  end

  private

  def render(*args)
    if @books.present? && param1.present? && param2.present?
      @books = @books.someaction param1, param2
    end
    super
  end

end