Rails - Как использовать помощник внутри контроллера - PullRequest
193 голосов
/ 27 февраля 2011

, хотя я понимаю, что вы должны использовать помощник внутри представления, мне нужен помощник в контроллере, поскольку я создаю объект JSON для возврата.

Это выглядит примерно так:

def xxxxx

   @comments = Array.new

   @c_comments.each do |comment|
   @comments << {
     :id => comment.id,
     :content => html_format(comment.content)
   }
   end

   render :json => @comments
end

как я могу получить доступ к своему html_format помощнику?

Ответы [ 7 ]

275 голосов
/ 22 июня 2012

Вы можете использовать

  • helpers.<helper> in Rails 5 + (или ActionController::Base.helpers.<helper>)
  • view_context.<helper> ( Rails 4 &3 ) (ВНИМАНИЕ: это создает новый экземпляр представления для каждого вызова)
  • @template.<helper> ( Rails 2 )
  • включает помощника в одноэлементный класс, а затемsingleton.helper
  • include помощник в контроллере (ВНИМАНИЕ: превратит все методы помощника в действия контроллера)
198 голосов
/ 27 февраля 2011

Примечание: Это было написано и принято в Rails 2 дня;в настоящее время ответ грубого пользователя (ниже) - это путь.

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

class MyController < ApplicationController
  include MyHelper

  def xxxx
    @comments = []
    Comment.find_each do |comment|
      @comments << {:id => comment.id, :html => html_format(comment.content)}
    end
  end
end

Вариант 2: Или вы можете объявить вспомогательный метод как функцию класса и использовать его следующим образом:

MyHelper.html_format(comment.content)

Если вы хотите использовать его как функцию экземпляраи функцию класса, вы можете объявить обе версии в вашем помощнике:

module MyHelper
  def self.html_format(str)
    process(str)
  end

  def html_format(str)
    MyHelper.html_format(str)
  end
end

Надеюсь, это поможет!

77 голосов
/ 04 ноября 2016

В Rails 5 используйте helpers.helper_function в вашем контроллере.

Пример:

def update
  # ...
  redirect_to root_url, notice: "Updated #{helpers.pluralize(count, 'record')}"
end

Источник: из комментария @Markus для другого ответа.Я чувствовал, что его ответ заслуживает его собственного ответа, поскольку это самое чистое и простое решение.

Ссылка: https://github.com/rails/rails/pull/24866

10 голосов
/ 26 февраля 2016

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

class ApplicationController < ActionController::Base
  include ApplicationHelper

...
9 голосов
/ 23 марта 2014

В общем, если помощник должен использоваться (просто) в контроллерах, я предпочитаю объявлять его как метод экземпляра class ApplicationController.

1 голос
/ 09 декабря 2018

В Rails 5+ вы можете просто использовать функцию, как показано ниже на простом примере:

module ApplicationHelper
  # format datetime in the format #2018-12-01 12:12 PM
  def datetime_format(datetime = nil)
    if datetime
      datetime.strftime('%Y-%m-%d %H:%M %p')
    else
      'NA'
    end
  end
end

class ExamplesController < ApplicationController
  def index
    current_datetime = helpers.datetime_format DateTime.now
    raise current_datetime.inspect
  end
end

OUTPUT

"2018-12-10 01:01 AM"
0 голосов
/ 08 октября 2018
class MyController < ApplicationController
    # include your helper
    include MyHelper
    # or Rails helper
    include ActionView::Helpers::NumberHelper

    def my_action
      price = number_to_currency(10000)
    end
end

В Rails 5+ просто используйте помощники ( helpers.number_to_currency (10000) )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...