web-dev-qa-db-ja.com

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

ビュー内でヘルパーを使用することになっていることに気付きましたが、返す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ヘルパーにアクセスするにはどうすればよいですか?

191
AnApprentice

注:これは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

お役に立てれば!

199
Xavier Holt

使用できます

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

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

77
Gerry Shaw

オプション1で私の問題は解決しました。おそらく最も簡単な方法は、コントローラーにヘルパーモジュールを含めることです。

class ApplicationController < ActionController::Base
  include ApplicationHelper

...
10

一般に、ヘルパーを(ちょうど)コントローラーで使用する場合、class ApplicationControllerのインスタンスメソッドとして宣言することを好みます。

9
Franco

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"
1
Ravistm
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を使用します(-helpers.number_to_currency(10000)

0
albertm