【问题标题】:is it a bad practice to use instance variable in helper?在帮助程序中使用实例变量是一种不好的做法吗?
【发布时间】:2019-12-01 18:55:51
【问题描述】:

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

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

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

  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'

谢谢

【问题讨论】:

  • 我不知道这是不是一个不好的做法,但在这种情况下,它会让你的助手对将要使用它的地方了解太多。它依赖于一个@category 实例变量,它同时也是一个必须响应name 的对象,如果没有呢?这样的事情会使您的代码难以移动和/或测试。
  • 如果很难测试,那么它可能不是一个好的代码。我只会使用category 参数,更容易测试,更容易理解,更容易使用,没有魔法。

标签: ruby-on-rails view-helpers


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多