如何从视图中调用应用程序助手中的方法?

Ada*_*Lee 26 ruby-on-rails

我在application_helper.rb文件中定义了一个自定义方法,如下所示:

def rxtrnk(line)
    rxTRNK = /\w{9,12}/m
    trnks = Array.new
    i = 0
    while i <= line.size
        if line[i].match(rxTRNK)
            trnks[i] = line[i].scan(rxTRNK)
        end
        i += 1
    end

    return trnks
  end
Run Code Online (Sandbox Code Playgroud)

然后我试着从这样的视图中调用它:

<% @yo = rxtrnk(@rts)%>
Run Code Online (Sandbox Code Playgroud)

但我得到一个这样的错误页面:

NoMethodError in TrunksController#routesperswitch

undefined method `rxtrnk' for #<TrunksController:0x7f2dcf88>
Run Code Online (Sandbox Code Playgroud)

我知道这是一个非常新手的问题,但我无法通过谷歌搜索找到解决方案:(感谢您的帮助

编辑/这里是完整的application_helper.rb

module ApplicationHelper
     def rxtrnk(line)
    rxTRNK = /\w{9,12}/m
    trnks = Array.new
    i = 0
    while i <= line.size
        if line[i].match(rxTRNK)
            trnks[i] = line[i].scan(rxTRNK)
        end
        i += 1
    end

    return trnks
  end

end
Run Code Online (Sandbox Code Playgroud)

ez.*_*ez. 41

不确定是什么问题,但你可以通过在控制器中包含application_helper来解决这个问题

class TrunksController 
    include ApplicationHelper
end
Run Code Online (Sandbox Code Playgroud)

在视图调用中:

<%= @controller.rxtrnk %>
Run Code Online (Sandbox Code Playgroud)

  • 由于错误是TrunksController#routesperswitch`中的NoMethodError,因此在控制器的上下文中调用该方法.辅助方法通常不能从控制器访问,因此您必须明确地将模块包含在它们定义的位置,例如ez.这里建议. (3认同)

Tho*_*son 19

您应该确保包含要调用的方法的帮助程序包含在当前控制器中(在您要包含ApplicationHelper的情况下).这是使用控制器顶部的" helper"方法控制的.

许多Rails开发人员默认包含所有帮助程序,以避免考虑这一点.为此,将" helper :all" 添加到ApplicationController的顶部:

class ApplicationController < ActionController::Base
  helper :all
end
Run Code Online (Sandbox Code Playgroud)

您还可以选择仅包含ApplicationHelper:

class ApplicationController < ActionController::Base
  helper ApplicationHelper
end
Run Code Online (Sandbox Code Playgroud)


Pet*_*ete 6

你的TrunksController可能没有从ApplicationController扩展.应用程序控制器包含应用程序助手,因此如果您将控制器扩展为应用程序,则应该可以访问这些方法.

控制器的起点应该是这样的:

class TrunksController < ApplicationController
Run Code Online (Sandbox Code Playgroud)