让我们说我有这样的代码:
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操作的控制器。
发布于 2015-07-31 14:41:37
您可以重写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发布于 2015-07-31 14:35:51
只需在控制器中声明一个私有函数,并在操作中使用它:
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发布于 2015-07-31 14:39:55
我会看看曝光宝石。这样你就可以做如下的事情:
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
endhttps://stackoverflow.com/questions/31748627
复制相似问题