«Méthode non définie» lors de l’appel de la méthode d’assistance depuis le contrôleur dans Rails

Est-ce que quelqu’un sait pourquoi je reçois

undefined method `my_method' for # 

quand j’appelle my_method (“ssortingng”) depuis ma sous-classe ApplicationController? Mon contrôleur ressemble à

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

et mon aide

 module ApplicationHelper def my_method(ssortingng) return ssortingng end end 

et enfin, 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 

Vous ne pouvez pas appeler les helpers des contrôleurs. Votre meilleur pari est de créer la méthode dans ApplicationController si elle doit être utilisée dans plusieurs contrôleurs.

EDIT : pour être clair, je pense qu’une grande partie de la confusion (corrigez-moi si je me trompe) vient de l’ helper :all appelez helper :all . helper :all comprennent uniquement tous vos helpers à utiliser sous n’importe quel contrôleur du côté de la vue. Dans les versions beaucoup plus anciennes de Rails, les espaces de noms des helpers déterminaient quelles vues des contrôleurs pouvaient utiliser les helpers.

J’espère que ça aide.

view_context est votre ami, http://apidock.com/rails/AbstractController/Rendering/view_context

Si vous voulez partager des méthodes entre le contrôleur et afficher, vous avez d’autres options:

Incluez ApplicationHelper dans le fichier application_controller.rb comme ceci:

 class ApplicationController < ActionController::Base protect_from_forgery include ApplicationHelper end 

Ainsi, toutes les méthodes définies dans le fichier application_helper.rb seront disponibles dans le contrôleur.

Vous pouvez également inclure des assistants individuels dans des contrôleurs individuels.

Peut-être que je me trompe, mais les assistants ne sont-ils que pour les vues? Habituellement, si vous avez besoin d’une fonction dans un contrôleur, vous le placez dans ApplicationController car chaque fonction est disponible dans ses classes d’enfants.

Comme dit par gamecreature dans cet article :

  • Dans Rails 2, utilisez la variable @template .
  • Dans Rails 3, utilisez la méthode controller view_context

les helpers sont pour les vues, mais l’ajout d’une ligne de code pour inclure ce fichier d’aide dans ApplicationController.rb peut résoudre votre problème. dans votre cas, insérez la ligne suivante dans ApplicationController.rb:

 include ApplicationHelper 

Pour autant que je sache, helper :all rend les helpers disponibles dans les vues …

Essayez d’append module_function(*instance_methods) dans vos modules d’aide, après quoi vous pouvez appeler directement ces méthodes sur le module lui-même.

bien que ce ne soit pas une bonne pratique d’appeler des helpers dans controller car les helpers sont destinés à être utilisés dans des vues, la meilleure façon d’utiliser les helpers dans controller est de créer une méthode d’assistance dans application_controller et de les appeler au contrôleur.
mais même s’il est nécessaire d’appeler l’assistant dans un contrôleur
alors il suffit d’inclure l’aide dans le contrôleur

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

et appeler les méthodes d'assistance directement sur le contrôleur

  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 

Manette

 class ControllerName < ApplicationController include OffersHelper def new generate_qr_code('Example Text') end end 

J'espère que cela t'aides !

J’ai eu le même problème…

vous pouvez le contourner, le mettre dans un modèle ou créer une classe spécialement pour lui. Les modèles sont accessibles aux contrôleurs, contrairement à ces méthodes d’assistance embêtantes.

Voici mon modèle “rag.rb”

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

Voici une partie de mon contrôleur "rags_controller.rb"

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

Cela a donné une catattack sur le terminal, après avoir cliqué sur "update".

Étant donné une instanciation, les méthodes du modèle peuvent être appelées. Remplacez catattack par des codes. (C'est le meilleur que j'ai jusqu'à présent)

: helper all ouvre uniquement les helpers jusqu'aux vues.

Cela montre comment créer une classe et l'appeler. http://railscasts.com/episodes/101-refactoring-out-helper-object?autoplay=true

Essayez ceci pour accéder à la fonction d’assistance directement depuis vos contrôleurs view_context.helper_name