【问题标题】:RoR: defining a class inside a view helper fileRoR:在视图帮助文件中定义一个类
【发布时间】:2011-07-07 17:44:11
【问题描述】:

我有一个视图帮助文件 app/helpers/analysis_helper.rb,我一直在各种视图文件中使用它的顶级方法。工作正常。然后我在 analysis_helper.rb 中定义了一个 AnalysisSummary 类来打包一些特定于视图的功能。

但是,当我尝试在视图文件中实例化 AnalysisSummary 时,出现错误:

uninitialized constant ActionView::CompiledTemplates::AnalysisSummary

也许 Rails 告诉我我不应该在帮助文件中定义一个类?如果是这样,您建议在哪里停车 AnalysisSummary?它不是控制器,也不是模型……

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 helpers


    【解决方案1】:

    Railscasts #213 (Revised)(仅订阅者链接,唉)中,Ryan Bates 提供了一个示例,说明如何(以及为什么)在帮助程序中包含一个类。基本要点是这样的:

    # app/helpers/calendar_helper.rb
    module CalendarHelper
      def calendar(date = Date.today)
        Calendar.new(self, date).render
      end
    
      class Calendar
        def render
          # Calendar, render thyself
        end
        # ... additional methods called by #render
      end
    end
    

    对于那些反对 helpers 中的类的人,你如何看待 Ryan 的选择?助手用于生成标记,对吗?因此,如果类中的所有逻辑都与呈现(相当复杂)HTML 有关,我会认为它 所做的 (而不是它 )使其适合包含在助手中。

    【讨论】:

    • 这是一个很好的解决方案,它继续将所有辅助逻辑封装在一个文件中,同时还赋予它更多的结构和形式。谢谢! (感谢瑞恩!)
    【解决方案2】:

    您可以通过明确提及助手名称来调用该类

    ApplicationHelper::AnalysisSummary.new
    

    但我认为在助手中设置类不是一个好主意。

    【讨论】:

      【解决方案3】:

      为什么它需要是一个类?为什么不只是方法的集合?这就是 helper 的含义:一组有用的方法。业务逻辑不属于助手。不过,如果您想提供更多结构和组织,您可以将代码放在帮助文件中的模块中。

      您可以在app/models 中放置类,而不必是 ActiveRecord 类,但在将其放置在其中之前,您应该认真考虑类的目的。

      如果它只涉及渲染视图,而不是直接访问数据,它属于视图或视图助手。

      【讨论】:

      • @Andrew Marshall:我本来可以更明确一点:该类封装了三个模型,并提取了我的视图所需的信息。由于它包含实例,因此单独的方法集合无济于事。至于“它属于视图或视图助手”,嗯,它在视图助手中。至少,这是我的意图。
      • 您是说它应用于三个模型的视图还是从三个模型中获取数据
      • 从三个模型中获取数据。
      • 那么它不应该出现在视图中。视图不应该直接访问模型,这是控制器的工作。视图应该只通过控制器给它的变量访问模型中的数据。
      • 你能澄清一下吗?这不是说视图不应该直接访问@user,因为@user 是一个模型吗?我所做的并没有那么不同。
      【解决方案4】:

      那么它是一个模块 :) 绝对不要在帮助器中定义类。 Jsut 使用一个简单的模块来完成这项工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-27
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        相关资源
        最近更新 更多