레일즈-컨트롤러 안에서 헬퍼를 사용하는 방법


207

뷰에서 도우미를 사용해야한다는 것을 알고 있지만 반환 할 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도우미에 어떻게 액세스 할 수 있습니까?


2
@grosser의 답변을 고려할 수도 있습니다. 훨씬 더 완벽합니다.
tokland

나는 이것이 오래되었다는 것을 알고 있지만 ... 일반 루비 클래스의 문제점은 무엇입니까? : p
Tarek

답변:


205

참고 : 이 글은 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

도움이 되었기를 바랍니다!


고맙지 만 조금 혼란 스러워요. 지금 내 도우미가 /app/helpers/application_helper.rb에 있습니다 ... 도우미를 ApplicationController로 옮겨야한다고 제안하고 있습니까?
AnApprentice

내 application_controller에 'include ApplicationHelper'를 추가했지만 'NoMethodError (ApplicationHelper : Module에 대해 정의되지 않은 메소드`html_format') : '오류가 발생했습니다.
AnApprentice

1
@AnApprentice 당신이 그것을 알아 낸 것처럼 보이지만, 나는 대답을 약간 조정하여 희망을 분명히했습니다. 첫 번째 버전에서는 두 번째 버전 만 사용 html_format하면됩니다 MyHelper.html_format.
Xavier Holt

4
사용하려는 도우미 메서드가와 같은 뷰 메서드를 사용하는 경우에는 작동하지 않습니다 link_to. 컨트롤러는 이러한 방법에 액세스 할 수 없으며 대부분의 도우미가이 방법을 사용합니다. 또한, 헬퍼를 컨트롤러에 포함 시키면 모든 헬퍼의 메소드가 공개적으로 액세스 가능한 조치로 노출되지 않습니다. view_contextRails 3으로가는 길입니다.
GregT

@GregT-사실 그 뒤에 약간 나오기 때문에 그로스의 대답을 보지 못했지만 나도 그것을 좋아합니다. 방금 공감 했어
Xavier Holt

304

당신이 사용할 수있는

  • helpers.<helper>에서 레일 5+ (또는 ActionController::Base.helpers.<helper>)
  • view_context.<helper>( Rails 4 & 3 ) (경고 : 통화 당 새로운 뷰 인스턴스를 인스턴스화 함)
  • @template.<helper>( 레일 2 )
  • 싱글턴 클래스에 도우미를 포함시킨 다음 singleton.helper
  • include 컨트롤러의 도우미 (경고 : 모든 도우미 메서드를 컨트롤러 작업으로 만듭니다)

56
이 답변이 더 좋습니다! 레일 3에서는 단순히 전화하는 view_context.helper_function것이 간단하고 훌륭합니다. ActionController::Base.helpers.helper_function똑같이 좋습니다.
trisweb

29
view_context= 천재
n_i_c_k

5
경고 :를 사용하지 마십시오 view_context. 호출 당 새로운 뷰 인스턴스를 인스턴스화합니다.
fny

7
ActionController::Base.helpers.helper_function작동하지 않는 것 같습니다. 컨트롤러 메소드 NoMethodError - undefined method spell_date_and_time' for #<ActionView::Base:0x007fede56102d0>:를 호출하려고 할 때 얻습니다 ActionController::Base.helpers.spell_date_and_time(). view_context.spell_date_and_time()그러나 전화 는 작동합니다.
메기

37
레일 5 : helpers.helper_function컨트롤러에서 간단히 사용 ( github.com/rails/rails/pull/24866 )
Markus

80

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


6
콘솔 helper에서 단일 및 컨트롤러에서 복수 라고 부르는 것이 이상하게 느껴 집니다.
동료 낯선 사람

10

내 문제는 옵션 1로 해결되었습니다. 아마도 가장 간단한 방법은 컨트롤러에 도우미 모듈을 포함시키는 것입니다.

class ApplicationController < ActionController::Base
  include ApplicationHelper

...

1
도우미 함수의 이름으로 컨트롤러 작업을 추가한다는 단점 만 있습니다. 그러나 tbh, 나도 그렇게 :)
펠릭스

9

일반적으로 도우미가 (단지) 컨트롤러에서 사용되는 경우 인스턴스 메소드로 선언하는 것을 선호합니다 class ApplicationController.


5
보호 된 방법으로
Benjamin Crouzier

3

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

산출

"2018-12-10 01:01 AM"

0
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) )를 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.