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
假设我有这段代码:
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