当前位置:  开发笔记 > 后端 > 正文

尝试从Rails控制器调用helper方法时出现NoMethodError

如何解决《尝试从Rails控制器调用helper方法时出现NoMethodError》经验,为你挑选了7个好方法。

我正NoMethodError试图从我的一个控制器类中访问我的一个辅助模块中定义的方法.My Rails应用程序使用helper带有:all符号的类方法,如下所示:

class ApplicationController < ActionController::Base
  helper :all
  .
  .
end

我的理解是,这应该使我的所有控制器类自动包含app/helpers目录中的所有辅助模块,因此将所有方法混合到控制器中.它是否正确?

如果我include在控制器中明确指出了辅助模块,那么一切正常.



1> gamecreature..:

要使用模板引擎中已包含的辅助方法:

Rails 2:使用@template变量.

Rails 3:具有很好的控制器方法 view_context

在控制器方法中调用'number_to_currency'的示例用法:

# rails 3 sample
def controller_action
  @price = view_context.number_to_currency( 42.0 ) 
end

# rails 2 sample
def controller_action
  @price = @template.number_to_currency( 42.0 ) 
end


对于Rails 3.这是答案.
这是最好的答案 - 应该在顶部
另一个解决方案(适用于两个rails版本)是使用:ApplicationController.helpers.number_to_currency(42.0)

2> Honza..:

helper :all 使视图中的所有助手(是的,所有助手)都可用,它不包括在控制器中.

如果你想在helper和controller之间共享一些代码,这不是很理想,因为helper是UI代码而控制器是控制器代码,你可以在控制器中包含帮助器,或者创建一个单独的模块并将其包括在内控制器和助手也是如此.


它真的是关于两个控制器之间的共享吗?或者在控制器和视图之间?我想后者.所以gamecreature的方式(@template,view_context)对我来说是正确的.
你说在控制器中包含辅助方法是不可取的,因为UI代码和控制器代码应该是分开的.但是如果你正在进行过滤并且显然需要访问控制器和视图中的params哈希,有时你需要在视图和控制器中调用方法来访问params变量.那么在那种情况下你会怎么做?

3> 小智..:

如果你需要在控制器和助手/视图之间共享一个方法,你可以通过控制器顶部的'helper_method'来定义:

class ApplicationController < ActionController::Base
  helper_method :my_shared_method
  ...

  def my_shared_method
    #do stuff
  end
end

希望有所帮助


行`helper_method:my_shared_method`确实*不需要在"顶部"..它可以去任何地方,我最喜欢它在定义之上(`def my_shared_method`).

4> Adrian Dunst..:

控制器的辅助方法

获取辅助方法的一种方法就是包含辅助文件.

include LoginHelper
cool_login_helper_method(x,y,z)

这将该辅助模块的所有方法都带入控制器的范围.这并不总是一件好事.要保持范围分离,请创建一个对象,使其具有该帮助程序的强大功能,并使用它来调用方法:

login_helper = Object.new.extend(LoginHelper)
login_helper.cool_login_helper_method(x,y,z)

帮助者:全部

helper :all使所有助手模块中的所有辅助方法都可用于所有视图,但它对您的控制器没有任何作用.这是因为辅助方法设计用于视图,通常不应从控制器访问. 在较新版本的Rails中,默认情况下,此选项始终为每个控制器启用.



5> B Seven..:

对于Rails 3,请使用view_context控制器中的方法:

def foo
  view_context.helper_method
  ...

这是一个例子:http://www.christopherirish.com/2011/10/13/no-view_context-in-rails-3-1-changes/



6> Scott Miller..:

我觉得最需要的时候是写flash或自定义错误检查器.在某些情况下,很高兴在flash消息中使用link_to helpers之类的东西.我使用以下解决方案将ActionView助手添加到控制器中.请注意,如上所述,这打破了MVC分离,所以如果其他人有更好的想法,请告诉我!

在ApplicationController下面添加:

class Something
  include Singleton
  include ActionView::Helpers::UrlHelper
end

在ApplicationController中,添加

def foo
  Something.instance
end

最后,在您要访问帮助程序代码的控制器中:

messages << "
  • Your have an Error!<%= foo.link_to('Fix This', some_path) %>
  • "

    希望在某种程度上有所帮助!



    7> Antonio Tapi..:

    使用帮助器方法可能更简洁:

    class FooController < ActionController::Base
      def action
        self.class.helpers.helper_method arg
      end
    end
    

    推荐阅读
    mobiledu2402851377
    这个屌丝很懒,什么也没留下!
    DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
    Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有