"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
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.
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:
- użyj view_context
- zdefiniuj go w kontrolerze i Udostępnij w widoku metodą klasy helper_method http://apidock.com/rails/ActionController/Helpers/ClassMethods/helper_method
- zdefiniuj go w współdzielonym module i dołącz/rozszerz
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.
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.
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
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
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...
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.
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 !
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 " modelclass 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
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
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