Ruby on rails 3 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

我对Rails非常陌生,我尝试设置一个要在视图中使用的模块文件。因此,我认为正确的行为是将模块定义为控制器中的助手,瞧,它应该工作了。然而,我的情况并非如此。结构如下

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