"undefined method" przy wywołaniu metody helper z kontrolera w Rails

Czy ktoś wie dlaczego dostaję

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

Kiedy wywołuję my_method ("string") z podklasy ApplicationController? Mój kontroler wygląda jak

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

I mój Pomocnik

module ApplicationHelper
  def my_method(string)
    return string
  end
end

I wreszcie 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
Author: Chad Johnson, 2010-03-05

11 answers

Nie możesz dzwonić do pomocników z kontrolerów. Najlepiej jest utworzyć metodę w ApplicationController, jeśli ma być używana w wielu kontrolerach.

EDIT: żeby było jasne, myślę, że wiele zamieszania (popraw mnie, jeśli się mylę) wynika z wywołania helper :all. helper :all naprawdę zawiera wszystkie Twoje pomocniki do użycia pod dowolnym kontrolerem po stronie widoku. W znacznie wcześniejszych wersjach Rails przestrzeń nazw helperów określała, które widoki kontrolerów mogą używać pomocnicy.

Mam nadzieję, że to pomoże.
 60
Author: theIV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-25 17:12:35

View_context jest twoim przyjacielem, http://apidock.com/rails/AbstractController/Rendering/view_context

Jeśli chcesz współdzielić metody pomiędzy kontrolerem i widokiem, masz dodatkowe opcje:

 33
Author: Viktor Trón,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-17 16:00:55

Dołącz ApplicationHelper do application_controller.plik rb w ten sposób:

class ApplicationController < ActionController::Base
  protect_from_forgery       
  include ApplicationHelper  
end

W ten sposób wszystkie metody zdefiniowane w application_helper.plik rb będzie dostępny w kontrolerze.

Można również dołączać poszczególne helpery do poszczególnych kontrolerów.

 23
Author: Bilal Ahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-10 09:05:27

Może się mylę, ale czy pomocnicy nie są tylko dla poglądów? Zazwyczaj, jeśli potrzebujesz funkcji w kontrolerze, umieszczasz ją w ApplicationController, ponieważ każda funkcja jest dostępna w klasach podrzędnych.

 7
Author: stex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 18:16:02

Jak powiedział gamecreature w ten post :

  • w Rails 2 Użyj zmiennej @template.
  • w Rails 3 użyj metody kontrolera view_context
 6
Author: chech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:36

Helpery są przeznaczone dla widoków, ale dodają linię kodu, aby dołączyć ten plik pomocniczy do ApplicationController.rb może zająć się Twoim problemem. w Twoim przypadku Wstaw następujący wiersz w ApplicationController.rb:

include ApplicationHelper
 4
Author: btaek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-11 11:13:13

Z tego co wiem, helper :all udostępnia pomocników w widokach...

 3
Author: Ju Nogueira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 18:18:47

Spróbuj dodać module_function(*instance_methods) do modułów pomocniczych, po czym możesz bezpośrednio wywołać te metody w samym module.

 3
Author: Minqi Pan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-01 08:45:43

Chociaż nie jest dobrą praktyką wywoływanie helperów w kontrolerze, ponieważ helpery mają być używane w widokach najlepszym sposobem użycia helperów w kontrolerze jest utworzenie metody helper w application_controller i wywołanie ich do kontrolera,
ale nawet jeśli wymagane jest wywołanie helpera w kontrolerze
następnie wystarczy umieścić helper w kontrolerze

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

I wywołanie metod pomocniczych bezpośrednio do kontrolera

 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

Controller

class ControllerName < ApplicationController
include OffersHelper

def new
  generate_qr_code('Example Text')
end
end

Hope this pomaga !

 1
Author: sudhir Vishwakarma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-24 06:48:01

Miałem ten sam problem...

Możesz go zhakować, umieścić tę logikę w modelu lub stworzyć klasę specjalnie dla niego. Modele są dostępne dla kontrolerów, w przeciwieństwie do tych nieznośnych metod pomocniczych.

Oto moja " szmata.RB " model
class Rag < ActiveRecord::Base
  belongs_to :report
  def miaow()
    cat = "catattack"
  end  
end

Oto część mojego " rags_controller.RB " controller

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

To dało katattack na terminalu, po kliknięciu "update".

Biorąc pod uwagę instancję, metody w modelu mogą być wywołane. Zastąp catattack kilkoma kody. (To jest najlepsze, jakie mam do tej pory)

:helper all otwiera tylko helpery do widoków.

To pokazuje, jak zrobić klasę i nazwać ją. http://railscasts.com/episodes/101-refactoring-out-helper-object?autoplay=true

 0
Author: xxjjnn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-28 16:58:09

Spróbuj tego, aby uzyskać dostęp do funkcji pomocnika bezpośrednio z kontrolerów view_context.helper_name

 0
Author: Felipe M Andrada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-18 13:31:34