web-dev-qa-db-ja.com

Railsでコントローラーからヘルパーメソッドを呼び出すときの「未定義のメソッド」

誰が私が得る理由を知っていますか

undefined method `my_method' for #<MyController:0x1043a7410>

applicationControllerサブクラス内からmy_method( "string")を呼び出すと?私のコントローラーは次のようになります

class MyController < ApplicationController
  def show
    @value = my_method(params[:string])
  end
end

そして私のヘルパー

module ApplicationHelper
  def my_method(string)
    return string
  end
end

そして最後に、ApplicationController

class ApplicationController < ActionController::Base
  after_filter :set_content_type
  helper :all
  helper_method :current_user_session, :current_user
  filter_parameter_logging :password
  protect_from_forgery # See ActionController::RequestForgeryProtection for details
41
Chad Johnson

コントローラーからヘルパーを呼び出すことはできません。複数のコントローラーで使用する必要がある場合は、ApplicationControllerにメソッドを作成することをお勧めします。

[〜#〜] edit [〜#〜]:明確にするために、helper :all呼び出し。 helper :allは、実際にはビュー側の任意のコントローラーで使用するヘルパーをすべて含んでいます。 Railsの以前のバージョンでは、ヘルパーの名前空間によって、どのコントローラーのビューがヘルパーを使用できるかが決まりました。

これがお役に立てば幸いです。

61
theIV

view_contextはあなたの友達です http://apidock.com/Rails/AbstractController/Rendering/view_context

コントローラとビューの間でメソッドを共有したい場合、さらにオプションがあります:

33
Viktor Trón

次のようにapplication_controller.rbファイルにApplicationHelperを含めます。

class ApplicationController < ActionController::Base
  protect_from_forgery       
  include ApplicationHelper  
end

これにより、application_helper.rbファイルで定義されているすべてのメソッドがコントローラーで使用可能になります。

個々のコントローラーに個々のヘルパーを含めることもできます。

26
Bilal Ahmed

たぶん私は間違っているが、ヘルパーはビューのためだけではないのか?通常、コントローラーに関数が必要な場合は、子クラスで使用可能なすべての関数としてApplicationControllerに配置します。

7
stex

gamecreature in この投稿

  • In Rails 2は@template変数。
  • In Rails 3はコントローラーメソッドを使用しますview_context
6
chech

ヘルパーはビュー用ですが、そのヘルパーファイルをApplicationController.rbに含めるコード行を追加すると、問題を処理できます。あなたの場合、ApplicationController.rbに次の行を挿入します。

include ApplicationHelper
4
btaek

ヘルパーモジュールにmodule_function(*instance_methods)を追加してみてください。その後、モジュール自体でこれらのメソッドを直接呼び出すことができます。

3
Minqi Pan

私の知る限りでは、 helper :allヘルパーをビューで使用可能にします...

3
Ju Nogueira

ヘルパーはビューで使用するためのものであるため、コントローラーでヘルパーを呼び出すことはお勧めできませんが、コントローラーでヘルパーを使用する最良の方法は、application_controllerでヘルパーメソッドを作成してコントローラーに呼び出すことです。
しかし、コントローラーでヘルパーを呼び出す必要がある場合でも
その後、コントローラーにヘルパーを含めるだけです

class ControllerName < ApplicationController
  include HelperName
  ...callback statements..

ヘルパーメソッドをコントローラーに直接呼び出します

 module OffersHelper
  def generate_qr_code(text)
    require 'barby'
    require 'barby/barcode'
    require 'barby/barcode/qr_code'
    require 'barby/outputter/png_outputter'
    barcode = Barby::QrCode.new(text, level: :q, size: 5)
    base64_output = Base64.encode64(barcode.to_png({ xdim: 5 }))
    "data:image/png;base64,#{base64_output}"
  end

コントローラ

class ControllerName < ApplicationController
include OffersHelper

def new
  generate_qr_code('Example Text')
end
end

お役に立てれば !

1

これを試して、コントローラーからヘルパー関数に直接アクセスしてくださいview_context.helper_name

0

私は同じ問題を抱えていました...

あなたはそれをハック/回避したり、そのロジックをモデルに入れたり、特別にクラスを作成したりすることができます。厄介なヘルパーメソッドとは異なり、モデルはコントローラーにアクセスできます。

これが私の「rag.rb」モデルです

class Rag < ActiveRecord::Base
  belongs_to :report
  def miaow()
    cat = "catattack"
  end  
end

ここに私の「rags_controller.rb」コントローラの一部があります

def update
  @rag = Rag.find(params[:id])
  puts @rag.miaow()
  ...

「更新」をクリックした後、これは端末で攻撃を受けました。

インスタンス化を指定すると、モデル内のメソッドを呼び出すことができます。カタタックをいくつかのコードに置き換えます。 (これは今までで最高です)

:helper allは、ビューまでヘルパーのみを開きます。

これは、クラスを作成して呼び出す方法を示しています。 http://railscasts.com/episodes/101-refactoring-out-helper-object?autoplay=true

0
xxjjnn