【问题标题】:undefined local variable or method `<helper_variable>'未定义的局部变量或方法 `<helper_variable>'
【发布时间】:2016-04-29 09:28:17
【问题描述】:

我正在尝试从我的项目中的 haml 视图访问辅助变量。我在rails-root/app/helpers/table_field_helper.rb 中定义了助手:

module TableFieldHelper
    def table_display_fields
        MORE_COMPLICATED_TABLE_DISPLAY_FIELDS #some array defined elsewhere in the file
    end
    ...
end

并尝试在 index.html.haml 中迭代 table_display_fields

...
%tr
    %th
    - table_display_fields.each do |field|
        %th= field
...

我收到一个错误:undefined local variable or method 'table_display_fields'

是什么导致了这个错误?为什么我无法访问 TableFieldHelper 中的定义?我是 Ruby/Rails 的新手,但我假设所有帮助程序都隐式包含在视图/布局文件中,而且我读过的任何内容都不会表明我必须做任何额外的事情才能使它们一起工作。谢谢!

【问题讨论】:

  • 根据您的 Rails 版本,控制器可能只包含具有匹配名称的帮助文件,如此处所述api.rubyonrails.org/classes/ActionController/Helpers.html
  • 这也会影响视图吗?我没有看到任何与视图直接相关的东西,只是控制器。编辑:我正在使用带有 rails 4.0.9 的 jrails,所以我不认为这是基于 stackoverflow.com/questions/1179865/… 所写内容的问题
  • 视图只能访问控制器提供的内容
  • include TableFieldHelper 在控制器中
  • include ::TableFieldHelper,正如@Michal Szyndel 所说,只有名称与控制器名称匹配的模块才会自动包含

标签: ruby-on-rails ruby haml helper


【解决方案1】:

如果辅助类名称与控制器名称不同,则您必须手动要求辅助类。 http://api.rubyonrails.org/classes/ActionController/Helpers.html 您可以将帮助程序类的名称更改为与您使用它的控制器相同的名称,也可以将其包含在控制器中。

【讨论】:

    【解决方案2】:

    要使用模块中的 mixin 方法,您必须包含它。

    对于控制器(与模型不同),不同之处在于模块将被自动包含,如果它的名称与相应的控制器匹配。

    在您的情况下,将以下内容添加到控制器将解决问题:

    include ::TableFieldHelper
    

    【讨论】:

    • 仍然没有运气,当我将它包含在index_controller.rb 中时,它给了我同样的错误,即使我把它放在application_controller.rb
    • 我不相信当你使用::TableFieldHelper 时它会抛出同样的uninitialized constant IndexController::TableFieldHelper 错误。你注意到::了吗?
    猜你喜欢
    • 2017-01-26
    • 2018-04-19
    • 2015-01-01
    • 2013-12-17
    • 2018-04-21
    • 2015-12-26
    相关资源
    最近更新 更多