Ruby on rails 在helper中使用实例变量是一种不好的做法吗?

Ruby on rails 在helper中使用实例变量是一种不好的做法吗?,ruby-on-rails,view-helpers,Ruby On Rails,View Helpers,我一直在重构一个旧项目,我看到一些助手方法很难测试,因为助手中存在实例变量 实现这一目标的最佳实践是什么?将这些实例变量作为参数传递给帮助程序 在测试中,我可以做这样的事情,但看起来很奇怪 it 'returns family and categoy names' do @category = instance_double(Category, name: 'category_name') expect(helper.meta_description_home_product

我一直在重构一个旧项目,我看到一些助手方法很难测试,因为助手中存在实例变量

实现这一目标的最佳实践是什么?将这些实例变量作为参数传递给帮助程序

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

  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

谢谢,我不会这么做的。它将您的控制器和视图层紧密地结合在一起,使未来的功能、重写和重构变得更加困难

它还使得读取、测试和修复控制器和视图的错误变得困难


关注与责任分离是一个值得考虑的问题。保留这些确实有助于长期项目。

我不会这么做。它将您的控制器和视图层紧密地结合在一起,使未来的功能、重写和重构变得更加困难

它还使得读取、测试和修复控制器和视图的错误变得困难


关注与责任分离是一个值得考虑的问题。保留这些信息对长期项目确实有帮助。

我不知道这是否是一种不好的做法,但在这种情况下,它会让你的助手对使用这些信息的地方知道得太多。它取决于一个
@category
实例变量,该变量同时也是一个必须响应
name
的对象,如果它没有响应呢?诸如此类的事情使得你的代码很难移动和/或测试。如果很难测试,那么它可能不是一个好的代码。我只会使用一个
category
参数,更容易测试,更容易理解,更容易使用,没有魔力。我不知道这是否是一个糟糕的做法,但在这种情况下,它会让你的助手知道太多关于它将被使用的地方。它取决于一个
@category
实例变量,该变量同时也是一个必须响应
name
的对象,如果它没有响应呢?诸如此类的事情使得你的代码很难移动和/或测试。如果很难测试,那么它可能不是一个好的代码。我只会使用一个
category
参数,更容易测试,更容易理解,更容易使用,没有魔力。
<% @products.each ...
  ...
  my_helper
...
  module ApplicationHelper
   def my_helper
     ...
     desctiption = 'blabla' if @category.name == 'blabla'