我正NoMethodError
试图从我的一个控制器类中访问我的一个辅助模块中定义的方法.My Rails应用程序使用helper
带有:all
符号的类方法,如下所示:
class ApplicationController < ActionController::Base helper :all . . end
我的理解是,这应该使我的所有控制器类自动包含app/helpers目录中的所有辅助模块,因此将所有方法混合到控制器中.它是否正确?
如果我include
在控制器中明确指出了辅助模块,那么一切正常.
要使用模板引擎中已包含的辅助方法:
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
helper :all
使视图中的所有助手(是的,所有助手)都可用,它不包括在控制器中.
如果你想在helper和controller之间共享一些代码,这不是很理想,因为helper是UI代码而控制器是控制器代码,你可以在控制器中包含帮助器,或者创建一个单独的模块并将其包括在内控制器和助手也是如此.
如果你需要在控制器和助手/视图之间共享一个方法,你可以通过控制器顶部的'helper_method'来定义:
class ApplicationController < ActionController::Base helper_method :my_shared_method ... def my_shared_method #do stuff end end
希望有所帮助
获取辅助方法的一种方法就是包含辅助文件.
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中,默认情况下,此选项始终为每个控制器启用.
对于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/
我觉得最需要的时候是写flash或自定义错误检查器.在某些情况下,很高兴在flash消息中使用link_to helpers之类的东西.我使用以下解决方案将ActionView助手添加到控制器中.请注意,如上所述,这打破了MVC分离,所以如果其他人有更好的想法,请告诉我!
在ApplicationController下面添加:
class Something include Singleton include ActionView::Helpers::UrlHelper end
在ApplicationController中,添加
def foo Something.instance end
最后,在您要访问帮助程序代码的控制器中:
messages << "
希望在某种程度上有所帮助!
使用帮助器方法可能更简洁:
class FooController < ActionController::Base def action self.class.helpers.helper_method arg end end