Rails - 将模块包含到控制器中,以便在视图中使用

时间:2012-06-15 15:08:25

标签: ruby-on-rails-3 module

我是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天都在寻找这个废话。

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

来调用它

试试