在助手中使用实例变量是一种不好的做法吗?

is it a bad practice to use instance variable in helper?

我一直在重构一个旧项目,我发现一些辅助方法很难测试,因为辅助方法中存在实例变量。

实现此目标的最佳做法是什么?将这些实例变量作为参数传递给助手...

在测试中我可以做这样的事情,但看起来很奇怪

  it 'returns family and categoy names' do
    @category = instance_double(Category, name: 'category_name')
    expect(helper.meta_description_home_products).to eq(
      'blabla - categoria'
    )
  end

以控制器视图和助手为例:

class HomeController < BaseController
  @family = ...
  @category = ...
  @products = ...
end

并在浏览量中

<% @products.each ...
  ...
  my_helper
...

在助手中:

  module ApplicationHelper
   def my_helper
     ...
     desctiption = 'blabla' if @category.name == 'blabla'

谢谢

我不会做的。它紧密耦合了你的控制器和视图层,使得未来的功能、重写和重构变得困难。

它也使您的控制器和视图难以阅读、测试和错误修复。

关注点和责任分离是需要考虑的问题。保留这些确实有助于长期项目。