Rails 控制器中的 5 个实例级助手方法无法识别助手。方法

Rails 5 instance level helpers method in controller not recognizing helpers. method

我正在尝试遵循 here, originally PR here 提到的 "New way to call helper methods in Rails 5"。

我可以让 "old approach" 与以下内容一起使用:

# 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

但是,通过新方法,我相信我应该能够删除 "include CustomersHelper" 并将 "helpers." 添加到控制器中的大写函数中,例如

# 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: undefined local variable or method `helpers' for #Customer:0x00000004d50be8>

我很好奇我可能做错了什么。

helpers 方法仅在 控制器 中可用,您正试图在 模型 中使用它。模特不会(也不应该)知道他们的 views/controllers/helpers。

看起来你需要的是一个常规模块(即不是 Rails 助手)或者一个装饰器(例如 draper)无论如何 helpers 方法赢了在这里帮助你。

建议将您的辅助方法限制在视图模板中,不要将视图辅助方法混入 rails 模型 classes。

您也可以简单地将 capitalize(ruby String class 的标准库方法)用于模型实例方法中的实例属性。

# 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'