NoMethodError при попытке вызвать вспомогательный метод от контроллера направляющих

Пит Гудлифф имеет серию на модульном тестировании кода с резьбой .

Это сложно. Я беру более простой выход и стараюсь, чтобы код резьбы был абстрагирован от фактического теста. Пит упоминает, что я делаю это неправильно, но у меня есть право на разделение, или мне просто повезло.

74
задан John Topley 17 January 2009 в 18:18
поделиться

7 ответов

helper :all делает всех помощников (да, все они) доступный в представлениях, это не включает их в контроллер.

, Если Вы хотите совместно использовать некоторый код между помощником и контроллером, который не очень желателен, потому что помощник является кодом UI и контроллером, ну, в общем, код контроллера, можно или быть помощника в контроллер, или создать отдельный модуль и включать это в контроллер и помощника также.

50
ответ дан theIV 7 November 2019 в 07:27
поделиться

Вспомогательные методы от Контроллеров

Один способ достигнуть Ваши вспомогательные методы состоят в том, чтобы просто включать Ваш файл помощника.

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 делает все Ваши вспомогательные методы от всех Ваших модулей помощника доступными всему Вашему представления , но это ничего не делает для Ваших контроллеров. Это вызвано тем, что вспомогательные методы разработаны для использования в представлениях и обычно не должны получаться доступ от контроллеров. В более новых версиях направляющих, эта опция всегда включена для каждого контроллера по умолчанию.

28
ответ дан Adrian Dunston 7 November 2019 в 07:27
поделиться

Время, когда я нахожу, что это больше всего необходимо, для записи флэш-памяти или пользовательских ошибочных средств проверки. Его хорошее для использования вещей как 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, которая помогает в некотором роде!

5
ответ дан Scott Miller 7 November 2019 в 07:27
поделиться

Помощники должны использоваться с шаблонами, т.е. представлениями, не в контроллерах. Вот почему Вы не можете получить доступ к методу. Если бы требуется совместно использовать метод между двумя контроллерами, необходимо было бы определить его в ApplicationController, например. помощник: все говорит, что любой метод, который Вы определяете в любом файле помощника в каталоге приложения/помощников, будет доступен любому шаблону.

2
ответ дан Milan Novota 7 November 2019 в 07:27
поделиться

Если вам нужно поделиться методом между контроллером и помощником / видом, вы можете просто определить через «helper_method» в верхней части контроллера:

class ApplicationController < ActionController::Base
  helper_method :my_shared_method
  ...

  def my_shared_method
    #do stuff
  end
end

Надеюсь, что помогает

30
ответ дан 24 November 2019 в 12:06
поделиться

К любому помощнику можно получить доступ, используя переменную @template в контроллере.

@template.my_super_helper

4
ответ дан 24 November 2019 в 12:06
поделиться

Есть два способа сделать это: либо создать модуль, либо использовать переменную @template. Проверьте это для более подробной информации http://www.shanison.com/?p=305

1
ответ дан 24 November 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: