44

なぜ私が得たのか誰か知っていますか

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
4

12 に答える 12

61

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

編集:明確にするために、私は多くの混乱(私が間違っている場合は私を訂正してください)はhelper :all電話から生じていると思います。helper :all実際には、ビュー側の任意のコントローラーで使用するためのすべてのヘルパーが含まれています。Railsの以前のバージョンでは、ヘルパーの名前空間によって、どのコントローラーのビューがヘルパーを使用できるかが決まりました。

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

于 2010-03-05T18:13:35.700 に答える
34

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

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

于 2011-06-17T16:00:55.180 に答える
7

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

于 2010-03-05T18:16:02.543 に答える
6

この投稿でgamecreatureが言ったように:

  • Rails 2 では@template変数を使用します。
  • Rails 3 では、コントローラー メソッドを使用します。view_context
于 2012-01-23T10:23:56.857 に答える
3

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

于 2014-07-01T08:45:43.037 に答える
3

私の知る限りhelper :all、ビューでヘルパーを利用できるようにします...

于 2010-03-05T18:18:47.000 に答える
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()
  ...

「更新」をクリックした後、これは端末に大打撃を与えました。

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

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

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

于 2011-07-28T16:58:09.770 に答える