Joh*_*ley 73 ruby ruby-on-rails
我正NoMethodError试图从我的一个控制器类中访问我的一个辅助模块中定义的方法.My Rails应用程序使用helper带有:all符号的类方法,如下所示:
class ApplicationController < ActionController::Base
helper :all
.
.
end
Run Code Online (Sandbox Code Playgroud)
我的理解是,这应该使我的所有控制器类自动包含app/helpers目录中的所有辅助模块,因此将所有方法混合到控制器中.它是否正确?
如果我include在控制器中明确指出了辅助模块,那么一切正常.
gam*_*ure 133
要使用模板引擎中已包含的辅助方法:
@template变量.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
Run Code Online (Sandbox Code Playgroud)
Hon*_*nza 50
helper :all 使视图中的所有助手(是的,所有助手)都可用,它不包括在控制器中.
如果你想在helper和controller之间共享一些代码,这不是很理想,因为helper是UI代码而控制器是控制器代码,你可以在控制器中包含帮助器,或者创建一个单独的模块并将其包括在内控制器和助手也是如此.
小智 30
如果你需要在控制器和助手/视图之间共享一个方法,你可以通过控制器顶部的'helper_method'来定义:
class ApplicationController < ActionController::Base
helper_method :my_shared_method
...
def my_shared_method
#do stuff
end
end
Run Code Online (Sandbox Code Playgroud)
希望有所帮助
Adr*_*ton 28
获取辅助方法的一种方法就是包含辅助文件.
include LoginHelper
cool_login_helper_method(x,y,z)
Run Code Online (Sandbox Code Playgroud)
这将该辅助模块的所有方法都带入控制器的范围.这并不总是一件好事.要保持范围分离,请创建一个对象,使其具有该帮助程序的强大功能,并使用它来调用方法:
login_helper = Object.new.extend(LoginHelper)
login_helper.cool_login_helper_method(x,y,z)
Run Code Online (Sandbox Code Playgroud)
helper :all使所有助手模块中的所有辅助方法都可用于所有视图,但它对您的控制器没有任何作用.这是因为辅助方法设计用于视图,通常不应从控制器访问. 在较新版本的Rails中,默认情况下,此选项始终为每个控制器启用.
对于Rails 3,请使用view_context控制器中的方法:
def foo
view_context.helper_method
...
Run Code Online (Sandbox Code Playgroud)
这是一个例子: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
Run Code Online (Sandbox Code Playgroud)
在ApplicationController中,添加
def foo
Something.instance
end
Run Code Online (Sandbox Code Playgroud)
最后,在您要访问帮助程序代码的控制器中:
messages << "<li class='error'>Your have an Error!<%= foo.link_to('Fix This', some_path) %></li>"
Run Code Online (Sandbox Code Playgroud)
希望在某种程度上有所帮助!
class FooController < ActionController::Base
def action
self.class.helpers.helper_method arg
end
end
Run Code Online (Sandbox Code Playgroud)