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 :
@template
. 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