【问题标题】:Ruby, Sinatra views and class methodsRuby、Sinatra 视图和类方法
【发布时间】:2016-07-11 19:10:00
【问题描述】:

我正在学习如何使用 Sinatra。我发现当我将对象作为本地人传递时,例如:

product = FetchProduct.new.call(id) #function finds exact Product instance
erb :"products/show", locals: { product: product }

我可以在我的视图中使用我声明的所有实例方法中的产品对象。但我不能使用任何类方法,任何尝试这样做都会给我未初始化的常量错误。如果我想使用Product.format_price(product.price) 方法应该怎么做?有没有办法将类方法传递给 Sinatra 视图?

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:
    klass = const_get( product.class )
    klass.format_price
    

    但这并没有真正的意义,因为你已经知道你想要Product.format_price。那你为什么不用Product.format_price呢?

    【讨论】:

      【解决方案2】:

      在您的视图中运行这种逻辑通常是个坏主意。最佳实践是尽可能为视图提供所需的任何服务。

      注意,您无法在视图中运行类方法的原因是因为 Product 在您的视图中不可访问,老实说,如果您想遵循 MVC 原则,则不应该这样做。

      如果它只是您在视图中需要的format_price 方法(特别是因为您似乎将Product 的实例传递给Product.format_price,这很奇怪并且代码味道很大),那么要么创建一个助手视图可访问的名为 format_price 的方法,或者更好的是,在控制器中(或在控制器中包含的帮助器模块中)创建一个名为 format_price 的帮助器方法,并将返回值作为本地即传递。

      get '/' do
        product = FetchProduct.new.call(id)
        erb :'products/show', locals: { 
          product: product, 
          price: format_price(product)
        }
      end
      
      private
      
      def format_price(product)
        # awesome formatting logic
      end
      

      【讨论】:

        猜你喜欢
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2017-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多