Ruby on rails 3 Rails—将模块包含到控制器中,以便在视图中使用
我对Rails非常陌生,我尝试设置一个要在视图中使用的模块文件。因此,我认为正确的行为是将模块定义为控制器中的助手,瞧,它应该工作了。然而,我的情况并非如此。结构如下Ruby on rails 3 Rails—将模块包含到控制器中,以便在视图中使用,ruby-on-rails-3,module,Ruby On Rails 3,Module,我对Rails非常陌生,我尝试设置一个要在视图中使用的模块文件。因此,我认为正确的行为是将模块定义为控制器中的助手,瞧,它应该工作了。然而,我的情况并非如此。结构如下 lib functions -- form_manager.rb 表格_manager.rb: Module Functions Module FormManager def error_message() ... end end end 用户\u controller.rb class
lib
functions
-- form_manager.rb
表格_manager.rb:
Module Functions
Module FormManager
def error_message() ...
end
end
end
用户\u controller.rb
class UsersController < ApplicationController
helper FormManager
def new ...
class UsersController
嗯,结构与上面的一样,当我从new.html.erb
调用错误消息时,它给出了一个错误:未初始化的常量用户controller::FormManager
所以,首先,我知道在rails 3中,lib不会自动加载。假设自动加载lib文件夹不是强制性的,那么我如何才能使其工作,我缺少了什么
顺便说一句,请不要说这个问题是重复的。我告诉你我已经找了差不多两天了 您似乎在
函数
的内部对FormManager
进行命名,这意味着您可以通过帮助函数::FormManager
尝试一下,您的模块没有自动加载(至少在3.2.6中没有)。您必须显式地加载它。您可以通过以下代码行实现这一点
# in application.rb
config.autoload_paths += %W(#{config.root}/lib)
您可以使用Rails.application.config.autoload\u路径检查自动加载路径。也许它确实是为你定义的
现在您确定模块已加载,可以通过调用
> Functions::FormHelper
现在,默认情况下,您不能将该模块用作视图辅助对象。使用#included
在包含模块时定义帮助器。您可以通过这种方式实现“惰性评估”。我认为代码的问题在于helper
方法在包含模块之前被调用。(如果我错了,应该有人纠正我)
代码如下:
Module Functions
Module FormManager
def error_message() ...
end
def self.included m
return unless m < ActionController::Base
m.helper_method :error_message
end
end
end
编辑2:
您似乎不需要使用self.included
。这实现了相同的功能:
class ApplicationController < ActionController::Base
include Functions::FormManager
helper_method Functions::FormManager.instance_methods
end
class ApplicationController
这已经奏效了,非常感谢!:)但是,如果我删除了helper,它就不起作用了,所以最好保持原样:)顺便说一句,除了自动加载之外,没有其他方法吗?因为我相信当你自动加载时,即使你没有使用模块,它也会被加载。还有第二个问题:我是否应该像在包含的方法中那样列出模块中的每个方法?(我的意思是,像m.helper\u方法:create\u form,m.helper\u方法:destroy\u form等等)Hm,如果没有helper
?奇怪的用答案更新了帖子。你应该早点问这个问题,很抱歉你在这上面浪费了2天:(没有自动加载也不行。我想我必须坚持自动加载。再次感谢!事实上是这样。当自动加载关闭时,使用“require”而不是“include”。我说过你应该使用require
:)
class ApplicationController < ActionController::Base
include Functions::FormManager
helper_method Functions::FormManager.instance_methods
end