我是Rails的新手,我尝试设置要在视图中使用的模块文件。所以我认为正确的行为是将模块定义为控制器内的帮助器,瞧,它应该正常工作。但是,对我来说情况并非如此。这是结构。
lib
functions
-- form_manager.rb
form_manager.rb:
Module Functions
Module FormManager
def error_message() ...
end
end
end
users_controller.rb
class UsersController < ApplicationController
helper FormManager
def new ...
嗯,结构与上面的结构类似,当我从new.html.erb
调用error_message时,它给出了错误:uninitialized constant UsersController::FormManager
。
所以,首先,我知道在rails 3中lib不会自动加载。假设自动加载lib文件夹不是必须的,我怎样才能完成这项工作以及我缺少什么?
顺便说一句,请不要说这个问题是重复的。我告诉你我差不多2天都在寻找这个废话。答案 0 :(得分:14)
您的模块未自动加载(至少在3.2.6中没有)。你必须明确加载它。您可以使用以下代码行
来实现此目的 # in application.rb
config.autoload_paths += %W(#{config.root}/lib)
您可以使用Rails.application.config.autoload_paths
检查自动加载路径。也许它确实适合你?
现在您确定您的模块已加载,您可以通过调用
在rails console
中进行检查
> 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
您还应该从控制器中删除helper
行。
编辑:
您无需自动加载即可实现此目的。只需使用require "functions/form_manager"
即可。您为每个方法定义一个helper_method。如果您希望使用所有模块方法作为帮助者使用
def self.included m
return unless m < ActionController::Base
m.helper_method self.instance_methods
end
EDIT2:
您似乎不需要使用self.included
。这实现了相同的功能:
class ApplicationController < ActionController::Base
include Functions::FormManager
helper_method Functions::FormManager.instance_methods
end
答案 1 :(得分:0)
FormManager
内部显示您是Functions
的命名空间,这意味着您可以通过helper Functions::FormManager
试试