Rails-コントローラ内でヘルパーを使用する方法


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 2013年

私はこれが古いことを知っていますが...単純なルビクラスの何が問題になっていますか?:p
Tarek、2015

回答:


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、2011

'include ApplicationHelper'をapplication_controllerに追加しましたが、 'NoMethodError(undefined method `html_format' for ApplicationHelper:Module): 'でエラーが発生しました
AnApprentice

1
@AnApprenticeあなたはそれを理解したように見えますが、うまくいけば物事をより明確にするために、私は私の答えを少し微調整しました。最初のバージョンでは、あなたは単に使うことができますhtml_format-あなたMyHelper.html_formatは2番目でのみ必要です。
Xavier Holt

4
これは、使用するヘルパーメソッドがなどのビューメソッドを使用する場合は機能しませんlink_to。コントローラーはこれらのメソッドにアクセスできず、私のヘルパーのほとんどはこれらのメソッドを使用します。また、ヘルパーをコントローラーに含めると、すべてのヘルパーのメソッドが一般にアクセス可能なアクションとして公開され、これは適切ではありません。view_contextRailsの3に移動するための方法である
GregT

@GregT-グロッサの答えは、事実の少し後のことなので、以前は見ていませんでしたが、私もそれが好きです。彼は私の賛成票を得た。
Xavier Holt

303

使用できます

  • helpers.<helper>Railsの5+(またはActionController::Base.helpers.<helper>
  • view_context.<helper>Rails 4&3)(警告:これは呼び出しごとに新しいビューインスタンスをインスタンス化します)
  • @template.<helper>Rails 2
  • シングルトンクラスにヘルパーを含め、 singleton.helper
  • include コントローラーのヘルパー(警告:すべてのヘルパーメソッドをコントローラーアクションにします)

56
この答えはさらに良いです!Rails 3では、単に呼び出すだけview_context.helper_functionで簡単に機能します。ActionController::Base.helpers.helper_function同様に良いです。
trisweb 2012年

29
view_context= genius
n_i_c_k 2013年

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
マルクス

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.