7

我对 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 ...

好吧,结构就像上面那样,当我从中调用 error_message 时,new.html.erb它​​给了我错误:uninitialized constant UsersController::FormManager

所以,首先,我知道在 rails 3 lib 中不会自动加载。假设自动加载 lib 文件夹不是强制性的,我该如何进行这项工作,我错过了什么?

顺便说一句,请不要说这个问题是重复的。我告诉你我一直在寻找这个废话将近 2 天。

4

2 回答 2

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

编辑2:

看来您不需要使用self.included. 这实现了相同的功能:

class ApplicationController < ActionController::Base

  include Functions::FormManager
  helper_method Functions::FormManager.instance_methods

end
于 2012-06-15T16:28:19.337 回答
0

看来您正在其中进行命名空间FormManagerFunctions这意味着您可以通过helper Functions::FormManager

试试看

于 2012-06-15T16:00:00.470 回答