Пит Гудлифф имеет серию на модульном тестировании кода с резьбой .
Это сложно. Я беру более простой выход и стараюсь, чтобы код резьбы был абстрагирован от фактического теста. Пит упоминает, что я делаю это неправильно, но у меня есть право на разделение, или мне просто повезло.
helper :all
делает всех помощников (да, все они) доступный в представлениях, это не включает их в контроллер.
, Если Вы хотите совместно использовать некоторый код между помощником и контроллером, который не очень желателен, потому что помощник является кодом UI и контроллером, ну, в общем, код контроллера, можно или быть помощника в контроллер, или создать отдельный модуль и включать это в контроллер и помощника также.
Один способ достигнуть Ваши вспомогательные методы состоят в том, чтобы просто включать Ваш файл помощника.
include LoginHelper
cool_login_helper_method(x,y,z)
Это приносит все методы от того модуля помощника в объем в Вашем контроллере. Это - не всегда хорошая вещь. Для разделения объема создайте объект, пропитайте его с полномочиями того помощника и используйте его для вызова методов:
login_helper = Object.new.extend(LoginHelper)
login_helper.cool_login_helper_method(x,y,z)
<час> helper :all
делает все Ваши вспомогательные методы от всех Ваших модулей помощника доступными всему Вашему представления , но это ничего не делает для Ваших контроллеров. Это вызвано тем, что вспомогательные методы разработаны для использования в представлениях и обычно не должны получаться доступ от контроллеров. В более новых версиях направляющих, эта опция всегда включена для каждого контроллера по умолчанию.
Время, когда я нахожу, что это больше всего необходимо, для записи флэш-памяти или пользовательских ошибочных средств проверки. Его хорошее для использования вещей как link_to помощники в сообщении "молния" при некоторых обстоятельствах. Я использую следующее решение получить помощников ActionView в контроллер. Сообщите, что, как был упомянут выше, это повреждает разделение MVC, поэтому если у кого-либо еще есть лучшая идея, сообщите мне!
Ниже ApplicationController добавляют это:
class Something
include Singleton
include ActionView::Helpers::UrlHelper
end
и в ApplicationController, добавьте
def foo
Something.instance
end
и наконец в контроллере, где Вы хотите получить доступ к коду помощника:
messages << "<li class='error'>Your have an Error!<%= foo.link_to('Fix This', some_path) %></li>"
Hope, которая помогает в некотором роде!
Помощники должны использоваться с шаблонами, т.е. представлениями, не в контроллерах. Вот почему Вы не можете получить доступ к методу. Если бы требуется совместно использовать метод между двумя контроллерами, необходимо было бы определить его в ApplicationController, например. помощник: все говорит, что любой метод, который Вы определяете в любом файле помощника в каталоге приложения/помощников, будет доступен любому шаблону.
Если вам нужно поделиться методом между контроллером и помощником / видом, вы можете просто определить через «helper_method» в верхней части контроллера:
class ApplicationController < ActionController::Base
helper_method :my_shared_method
...
def my_shared_method
#do stuff
end
end
Надеюсь, что помогает
К любому помощнику можно получить доступ, используя переменную @template в контроллере.
@template.my_super_helper
Есть два способа сделать это: либо создать модуль, либо использовать переменную @template. Проверьте это для более подробной информации http://www.shanison.com/?p=305