【问题标题】:Rails 5 instance level helpers method in controller not recognizing helpers. method控制器中的 Rails 5 实例级助手方法无法识别助手。方法
【发布时间】:2017-05-25 02:54:33
【问题描述】:

我正在尝试遵循 here 中提到的“在 Rails 5 中调用辅助方法的新方法”,最初是 PR here

我可以使用“旧方法”来处理以下内容:

# app/models/order.rb
class Customer < ActiveRecord::Base
  include CustomersHelper
  # some code...

  def name_make_uppercase
    self.first_name = uppercase(first_name)
    self.last_name = uppercase(last_name)
  end
end

# app/helperss/customers_helper.rb
module CustomersHelper
  def uppercase(input)
    return unless input
    input[0] = input[0].to_s.capitalize
    input
  end
end

但是,使用新方法,我相信我应该能够删除“包括 CustomersHelper”并添加“帮助程序”。到我在控制器中的大写函数,例如

# app/models/order.rb
class Customer < ActiveRecord::Base
  # include CustomersHelper
  # some code...

  def name_make_uppercase
    self.first_name = helpers.uppercase(first_name)
    self.last_name = helpers.uppercase(last_name)
  end
end

但是,现在我的规范出现以下错误:

NameError: #Customer:0x00000004d50be8 的未定义局部变量或方法`helpers'>

我很好奇我做错了什么。

【问题讨论】:

    标签: ruby-on-rails controller ruby-on-rails-5 helpers


    【解决方案1】:

    建议将帮助方法限制在视图模板中,不要将视图帮助方法混入 Rails 模型类中。

    您也可以简单地将capitalizeString 类的 ruby​​ 标准库方法)用于模型实例方法中的实例属性。

    # app/models/order.rb
    class Customer < ActiveRecord::Base
    
      def name_make_uppercase
        self.first_name = first_name.capitalize
        self.last_name = last_name.capitalize
      end
    
    end
    

    并使用它:

    c = Customer.new(first_name: 'bruce', last_name: 'wayne')
    c.name_make_upcase
    c.first_name #=> 'Bruce'
    c.last_name #=> 'Wayne'
    

    【讨论】:

      【解决方案2】:

      helpers 方法仅在 控制器 中可用,您正尝试在 模型 中使用它。模型不(也不应该)了解他们的视图/控制器/助手。

      看起来您需要的是常规模块(即不是 Rails 助手)或装饰器(例如 draper)在任何情况下 helpers 方法在这里都帮不了您。

      【讨论】:

        猜你喜欢
        • 2011-11-24
        • 2011-11-24
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-25
        • 1970-01-01
        相关资源
        最近更新 更多