Где разместить вспомогательные методы Ruby для контроллеров Rails?

У меня есть некоторые методы Ruby, которые нужны некоторым (или всем) контроллерам. Я пробовал вставить их /app/helpers/application_helper.rb. Я использовал это для методов, которые будут использоваться в представлениях. Но контроллеры не видят этих методов. Есть ли другое место, где я должен их разместить, или мне нужно получить доступ к этим вспомогательным методам по-другому?

Используя последнюю стабильную версию Rails.


person at.    schedule 28.11.2012    source источник


Ответы (6)


Вы должны определить метод внутри ApplicationController.

person Ryan Bigg    schedule 28.11.2012
comment
Ему также нужно будет добавить helper_method :my_helper_method в ApplicationController, чтобы сделать их доступными для представлений. - person David; 29.11.2012
comment
не приведет ли это со временем к толстому контроллеру? - person bgcode; 20.11.2015
comment
также @David, который нарушает MVC - person bgcode; 20.11.2015

Начиная с Rails 4, беспокойство - лучший способ. Была хорошая статья, которая все еще может быть просмотрено через Wayback Machine.

По сути, если вы посмотрите в папку контроллеров, вы должны увидеть подпапку проблем. Создайте там модуль по этим линиям

module EventsHelper
  def do_something
  end
end

Затем в контроллере просто включите его

class BadgeController < ApplicationController
  include EventsHelper

  ...
end
person John Cleary    schedule 09.10.2014
comment
Я считаю это лучшим решением, когда вам не нужны вспомогательные методы, включенные во все ваши контроллеры. Это решение также применимо к моделям. - person Dennis; 21.01.2015
comment
Хороший. Спасибо :) - person tonyedwardspz; 17.06.2016
comment
Вы знаете, нужно ли нам использовать extend ActiveSupport::Concern с проблемами контроллера? - person Marklar; 16.02.2017
comment
Нет необходимости расширять ActiveSupport :: Concern внутри каталога controller / issues. Вам просто нужно определить модули над каталогом и просто включить их, как указано выше (для rails 4.2 и rails 5). - person Ravindra M; 24.07.2017
comment
наверное лучший ответ - person Anton Semenichenko; 04.04.2018
comment
Можно ли получить доступ к этому методу из представления? - person Jin Lim; 03.04.2020

вы должны определить методы внутри контроллера приложения, если у вас мало методов, вы можете сделать следующее

class ApplicationController < ActionController::Base    
  helper_method :first_method
  helper_method :second_method

  def first_method
    ... #your code
  end

  def second_method
    ... #your code
  end
end

Вы также можете включить вспомогательные файлы, как показано ниже

class YourController < ApplicationController
  include OneHelper
  include TwoHelper
end
person Muhamamd Awais    schedule 28.11.2012
comment
есть ли способ назначить все helper_methods в одной строке? - person Harsha M V; 17.04.2016
comment
@HarshaMV Я ​​думаю, ты можешь просто продолжать, как helper_method :first_method, :second_method. - person Franklin Yu; 06.09.2016

Вы можете вызывать любые вспомогательные методы из контроллера с помощью view_context, например.

view_context.my_helper_method
person David    schedule 28.11.2012

Ответ Райана Бигга хорош.

Другое возможное решение - добавить помощников к вашему контроллеру:

class YourController < ApplicationController
  include OneHelper
  include TwoHelper
 end

Наилучшие пожелания!

person hyperrjas    schedule 28.11.2012

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

# With new rails (>= 5) 

helpers.my_helper_method


# For console

helper.my_helper_method
person Aparichith    schedule 08.01.2020