Rails - включить модуль в контроллер, который будет использоваться в представлении

Я действительно новичок в 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.

Итак, во-первых, я знаю, что в рельсах 3 lib не загружается автоматически. Предполагая, что нет необходимости автоматически загружать папку lib, как я могу заставить это работать и чего мне не хватает?

Кстати, пожалуйста, не говорите, что этот вопрос повторяется. Я говорю вам, что искал это дерьмо почти 2 дня.

Ответы на вопрос(2)

Решение Вопроса

Ваш модуль не загружен автоматически (по крайней мере, в 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
 Savas Vedova15 июн. 2012 г., 21:09
На самом деле это так. Используйте & quot; требовать & quot; вместо "включить" когда автозагрузка выключена.
 15 июн. 2012 г., 22:38
хорошо, я сказал, что вы должны использоватьrequire :)
 15 июн. 2012 г., 19:01
Хм, не работает безhelper? Weird. Обновил пост с ответами. Вы должны были задать вопрос раньше, мне жаль, что вы потратили на это 2 дня впустую :(
 Savas Vedova15 июн. 2012 г., 20:00
Также не работает без автозагрузки. Полагаю, мне придется придерживаться автозагрузки. Еще раз спасибо!
 Savas Vedova15 июн. 2012 г., 18:40
Это сработало, спасибо большое! :) Однако, если я удалю помощника, он не будет работать, так что лучше оставить все как есть :) Кстати, нет ли другого способа, кроме автозагрузки? Потому что я считаю, что когда вы автоматически загружаете модуль, он все равно будет загружен, даже если вы не используете модуль. И второй вопрос: я должен перечислить каждый метод в модуле, как вы сделали во включенном методе? (Я имею в виду, например, m.helper_method: create_form, m.helper_method: destroy_form и т. Д ...)

Похоже, вы пространство именFormManager ВнутриFunctions что означает, что вы бы назвали этоhelper Functions::FormManager

Попробуй это

Ваш ответ на вопрос