복붙노트

[RUBY-ON-RAILS] NoMethodError 레일 컨트롤러에서 도우미 메서드를 호출 할 때

RUBY-ON-RAILS

NoMethodError 레일 컨트롤러에서 도우미 메서드를 호출 할 때

내 컨트롤러 클래스 중 하나에서 내 도우미 모듈 중 하나에 정의 된 방법에 액세스하려고 할 때 나는 NoMethodError을 얻고있다. 아래 그림과 같이 모든 기호 : 내 레일 응용 프로그램과의 헬퍼 클래스의 방법을 사용합니다 :

class ApplicationController < ActionController::Base
  helper :all
  .
  .
end

나의 이해는이 내 컨트롤러 클래스의 모든 자동 그러므로 컨트롤러로 모든 메소드에 혼합, 응용 프로그램 / 헬퍼 디렉토리에있는 도우미 모듈을 모두 포함해야한다는 것입니다. 이 올바른지?

내가 명시 적으로 컨트롤러 내에서 도우미 모듈을 포함하면 모든 것이 제대로 작동합니다.

해결법

  1. ==============================

    1.도우미 : 모두 (예, 그들 모두) 뷰에서 사용할 수있는, 그것은 컨트롤러로를 포함하지 않는 모든 헬퍼한다.

    도우미 : 모두 (예, 그들 모두) 뷰에서 사용할 수있는, 그것은 컨트롤러로를 포함하지 않는 모든 헬퍼한다.

    잘, 컨트롤러 코드, 당신은 컨트롤러에서 도우미를 포함하거나 별도의 모듈을 만들고있는 것을 포함하거나 할 수있다 도우미 UI 코드와 컨트롤러이기 때문에 당신은 도우미 매우 바람직하지 않다 컨트롤러 사이에 약간의 코드를 공유하고자하는 경우 컨트롤러와뿐만 아니라 도우미.

  2. ==============================

    2.이미 템플릿 엔진에 포함 된 헬퍼 메소드를 사용하려면 :

    이미 템플릿 엔진에 포함 된 헬퍼 메소드를 사용하려면 :

    컨트롤러 방법 'number_to_currency'을 호출의 사용 예제 :

    # rails 3 sample
    def controller_action
      @price = view_context.number_to_currency( 42.0 ) 
    end
    
    # rails 2 sample
    def controller_action
      @price = @template.number_to_currency( 42.0 ) 
    end
    
  3. ==============================

    3.당신이 컨트롤러와 도우미 / 뷰 사이의 방법을 공유 할 필요가있는 경우, 당신은 단지 컨트롤러의 상단에 'helper_method'를 통해 정의 할 수 있습니다 :

    당신이 컨트롤러와 도우미 / 뷰 사이의 방법을 공유 할 필요가있는 경우, 당신은 단지 컨트롤러의 상단에 'helper_method'를 통해 정의 할 수 있습니다 :

    class ApplicationController < ActionController::Base
      helper_method :my_shared_method
      ...
    
      def my_shared_method
        #do stuff
      end
    end
    

    희망이 도움이

  4. ==============================

    4.도우미의 방법에서 얻을 수있는 한 가지 방법은 도우미 파일을 포함하는 것입니다.

    도우미의 방법에서 얻을 수있는 한 가지 방법은 도우미 파일을 포함하는 것입니다.

    include LoginHelper
    cool_login_helper_method(x,y,z)
    

    이 컨트롤러의 범위에 해당 도우미 모듈에서 모든 방법을 제공합니다. 그것은 항상 좋은 일이 아니다. 임뷰는 그 도우미의 힘으로, 객체를 생성, 분리 된 범위를 유지하고 메서드를 호출하는 데 사용 :

    login_helper = Object.new.extend(LoginHelper)
    login_helper.cool_login_helper_method(x,y,z)
    

    도우미 : 모든 귀하의 의견을 모두 사용할 수 도우미 모듈의 모든로부터 헬퍼 메소드를 모두 만들지 만, 그것은 당신의 컨트롤러에 대한 아무것도하지 않는다. 도우미 방법은 뷰에서 사용하도록 설계 일반적으로 컨트롤러에서 액세스 할 수 없습니다해야하기 때문이다. 레일의 최신 버전에서이 옵션은 기본적으로 모든 컨트롤러에 항상이다.

  5. ==============================

    5.레일 3의 경우, 컨트롤러에 view_context 방법을 사용하십시오

    레일 3의 경우, 컨트롤러에 view_context 방법을 사용하십시오

    def foo
      view_context.helper_method
      ...
    

    다음 예는 다음과 같습니다 http://www.christopherirish.com/2011/10/13/no-view_context-in-rails-3-1-changes/

  6. ==============================

    6.나는이 가장 필요로 할 찾을 시간은 플래시, 또는 사용자 지정 오류 검사기를 쓰기위한 것입니다. 그것의 좋은 어떤 상황에서 플래시 메시지에 LINK_TO 도우미 등을 사용합니다. 나는 컨트롤러에 ActionView 도우미를 얻기 위해 다음과 같은 솔루션을 사용합니다. 위에서 언급 한 바와 같이 다른 사람이 더 나은 아이디어가있는 경우,이 휴식 MVC의 분리, 그래서 알려 명심!

    나는이 가장 필요로 할 찾을 시간은 플래시, 또는 사용자 지정 오류 검사기를 쓰기위한 것입니다. 그것의 좋은 어떤 상황에서 플래시 메시지에 LINK_TO 도우미 등을 사용합니다. 나는 컨트롤러에 ActionView 도우미를 얻기 위해 다음과 같은 솔루션을 사용합니다. 위에서 언급 한 바와 같이 다른 사람이 더 나은 아이디어가있는 경우,이 휴식 MVC의 분리, 그래서 알려 명심!

    와 ApplicationController 아래이 추가 :

    class Something
      include Singleton
      include ActionView::Helpers::UrlHelper
    end
    

    과와 ApplicationController 안에 추가

    def foo
      Something.instance
    end
    

    그리고 마지막으로, 당신은 도우미 코드에 액세스 할 컨트롤러 :

    messages << "<li class='error'>Your have an Error!<%= foo.link_to('Fix This', some_path) %></li>"
    

    어떤 식 으로든 도움이되기를 바랍니다!

  7. ==============================

    7.아마도 헬퍼 메소드를 사용하는 청소기입니다 :

    아마도 헬퍼 메소드를 사용하는 청소기입니다 :

    class FooController < ActionController::Base
      def action
        self.class.helpers.helper_method arg
      end
    end
    
  8. ==============================

    8.어떤 도우미는 컨트롤러에 @template 변수를 사용하여 액세스 할 수 있습니다.

    어떤 도우미는 컨트롤러에 @template 변수를 사용하여 액세스 할 수 있습니다.

  9. ==============================

    9.컨트롤러가 자동으로 액세스 도우미 메서드 수 없습니다. 우리는 응용 프로그램 컨트롤러에 포함해야합니다.

    컨트롤러가 자동으로 액세스 도우미 메서드 수 없습니다. 우리는 응용 프로그램 컨트롤러에 포함해야합니다.

    모듈 ApplicationHelper

     def hello_message
        "Hello World"
     end
    

    종료

    클래스와 ApplicationController

      include ApplicationHelper
    
      def message
         hello_message
      end
    

    종료

  10. ==============================

    10.도우미 즉, 템플릿을 사용할 수 있습니다. 하지 컨트롤러에 전망. 당신이 방법에 액세스 할 수없는 이유의 그. 두 컨트롤러 사이 방법을 공유하려는 경우 예를 들어,와 ApplicationController에 정의해야 할 것이다. 도우미 : 모두는 당신이 응용 프로그램의 모든 도우미 파일에 정의 어떤 방법 / 헬퍼 디렉토리가 어떤 템플릿을 사용할 수 있다고 말한다.

    도우미 즉, 템플릿을 사용할 수 있습니다. 하지 컨트롤러에 전망. 당신이 방법에 액세스 할 수없는 이유의 그. 두 컨트롤러 사이 방법을 공유하려는 경우 예를 들어,와 ApplicationController에 정의해야 할 것이다. 도우미 : 모두는 당신이 응용 프로그램의 모든 도우미 파일에 정의 어떤 방법 / 헬퍼 디렉토리가 어떤 템플릿을 사용할 수 있다고 말한다.

  11. ==============================

    11.하나의 모듈 또는 사용 @template 변수를 만들 :이 작업을 수행하는 방법은 두 가지가 있습니다. 자세한 내용은이 체크 아웃 http://www.shanison.com/?p=305

    하나의 모듈 또는 사용 @template 변수를 만들 :이 작업을 수행하는 방법은 두 가지가 있습니다. 자세한 내용은이 체크 아웃 http://www.shanison.com/?p=305

  12. ==============================

    12.당신은 당신의 응용 프로그램 내에서 ApplicationHelper이있는 경우 / 헬퍼는 ApplicationHelper을 포함하여 컨트롤러를로드하는 것보다 폴더. 기본적으로 레일은 컨트롤러와 같은 이름을 가진 도우미 모듈을로드합니다. (예컨대 ArticlesController는 ArticlesHelper로드한다). 당신은 당신이 컨트롤러의 각 하나를 업로드해야보다 당신은 많은 모델 (; 게시물 카테고리 예를 들어, 기사)가있는 경우. 워드 프로세서

    당신은 당신의 응용 프로그램 내에서 ApplicationHelper이있는 경우 / 헬퍼는 ApplicationHelper을 포함하여 컨트롤러를로드하는 것보다 폴더. 기본적으로 레일은 컨트롤러와 같은 이름을 가진 도우미 모듈을로드합니다. (예컨대 ArticlesController는 ArticlesHelper로드한다). 당신은 당신이 컨트롤러의 각 하나를 업로드해야보다 당신은 많은 모델 (; 게시물 카테고리 예를 들어, 기사)가있는 경우. 워드 프로세서

    돕는 사람

    module PostsHelper
        def find_category(number)
            return 'kayak-#{number}'
        end
        def find_other_sport(number)
            "basketball" #specifying 'return' is optional in ruby
        end
    end
    
    module ApplicationHelper
        def check_this_sentence
            'hello world'
        end
    
    end
    

    예 컨트롤러

    class ArticlesController < ApplicationController
        include ApplicationHelper
        include PostsHelper
        #...and so on...
    
      def show#rails 4.1.5
        #here I'm using the helper from PostsHelper to use in a Breadcrumb for the view
        add_breadcrumb find_other_sport(@articles.type_activite), articles_path, :title => "Back to the Index"
        #add_breadcrumb is from a gem ... 
        respond_with(@articles)
      end
    end
    
  13. ==============================

    13.당신이 당신의 application_controller.rb 파일을 변경하는 경우 ...

    당신이 당신의 application_controller.rb 파일을 변경하는 경우 ...

    class ApplicationController < ActionController::Base
      protect_from_forgery with: :exception
      include SessionsHelper
    end
    

    ... 모든 헬퍼는 모든 컨트롤러에 사용할 수 있습니다.

  14. from https://stackoverflow.com/questions/453762/nomethoderror-when-trying-to-invoke-helper-method-from-rails-controller by cc-by-sa and MIT license