Ik krijg een NoMethodError
wanneer ik probeer toegang te krijgen tot een methode die is gedefinieerd in een van mijn helpermodules vanuit een van mijn controllerklassen. My Rails-toepassing gebruikt de klassemethode helper
met het symbool :all
zoals hieronder weergegeven:
class ApplicationController < ActionController::Base
helper :all
.
.
end
Ik heb begrepen dat hierdoor al mijn controllerklassen automatisch alle helpermodules in de app/helpers-directory zouden moeten bevatten, waardoor alle methoden in de controllers worden gemengd. Klopt dit?
Als ik de helpermodule expliciet include
in de controller, dan werkt alles correct.
Antwoord 1, autoriteit 100%
Om de hulpmethoden te gebruiken die al in de sjabloon-engine zijn opgenomen:
- Rails 2: gebruik de variabele
@template
. - Rails 3: heeft de mooie controllermethode
view_context
Voorbeeld van het aanroepen van ‘number_to_currency’ in een controllermethode:
# 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
Antwoord 2, autoriteit 38%
helper :all
maakt alle helpers (ja, allemaal) beschikbaar in de weergaven, het neemt ze niet op in de controller.
Als je wat code wilt delen tussen helper en controller, wat niet erg wenselijk is omdat helper UI-code is en controller, nou ja, controllercode, dan kun je ofwel de helper in de controller opnemen, of een aparte module maken en neem dat ook op in de controller en de helper.
Antwoord 3, autoriteit 23%
Als je een methode wilt delen tussen een controller en helper/view, kun je dat gewoon definiëren via ‘helper_method’ bovenaan de controller:
class ApplicationController < ActionController::Base
helper_method :my_shared_method
...
def my_shared_method
#do stuff
end
end
hoop dat dat helpt
Antwoord 4, autoriteit 22%
Helper-methoden van controllers
Een manier om bij uw helpermethoden te komen, is door simpelweg uw helperbestand op te nemen.
include LoginHelper
cool_login_helper_method(x,y,z)
Dit brengt alle methoden van die helpermodule in bereik in uw controller. Dat is niet altijd goed. Om het bereik gescheiden te houden, maakt u een object, doordrenkt u het met de krachten van die helper en gebruikt u het om de methoden aan te roepen:
login_helper = Object.new.extend(LoginHelper)
login_helper.cool_login_helper_method(x,y,z)
Helper: allemaal
helper :all
maakt al je helpermethoden van al je helpermodules beschikbaar voor al je weergaven, maar het doet niets voor je controllers. Dit komt omdat helpermethoden zijn ontworpen voor gebruik in weergaven en over het algemeen niet toegankelijk moeten zijn vanaf controllers. In nieuwere versies van Rails staat deze optie standaard altijd aan voor elke controller.
Antwoord 5, autoriteit 5%
Gebruik voor Rails 3 de view_context
methode in je controller:
def foo
view_context.helper_method
...
Hier is een voorbeeld: http://www. christopherirish.com/2011/10/13/no-view_context-in-rails-3-1-changes/
Antwoord 6, autoriteit 4%
Het moment waarop ik vind dat dit het meest nodig is, is voor het schrijven van de flash of voor aangepaste foutcontroles. Het is leuk om onder bepaalde omstandigheden dingen als link_to-helpers in het flash-bericht te gebruiken. Ik gebruik de volgende oplossing om ActionView-helpers in de controller te krijgen. Houd er rekening mee dat, zoals hierboven vermeld, dit de MVC-scheiding verbreekt, dus als iemand anders een beter idee heeft, laat het me weten!
Voeg onder ApplicationController dit toe:
class Something
include Singleton
include ActionView::Helpers::UrlHelper
end
en binnen de ApplicationController, voeg
def foo
Something.instance
end
en tot slot, in de controller waar u toegang wilt krijgen tot de helpercode:
messages << "<li class='error'>Your have an Error!<%= foo.link_to('Fix This', some_path) %></li>"
Ik hoop dat dat op de een of andere manier helpt!
Antwoord 7, autoriteit 4%
Het is waarschijnlijk schoner om de helpersmethode:
class FooController < ActionController::Base
def action
self.class.helpers.helper_method arg
end
end
Antwoord 8, autoriteit 3%
Elke helper is toegankelijk via de variabele @template in de controller.
@template.my_super_helper
Antwoord 9, autoriteit 2%
Controller heeft niet automatisch toegang tot helpermethoden. We moeten ze opnemen in de app-controller.
module ApplicationHelper
def hello_message
"Hello World"
end
einde
klasse ApplicationController < ActionController::Base
include ApplicationHelper
def message
hello_message
end
einde
Antwoord 10, autoriteit 2%
Helpers moeten worden gebruikt met sjablonen, bijv. weergaven, niet in controllers. Daarom heb je geen toegang tot de methode. Als u een methode tussen twee controllers wilt delen, moet u deze bijvoorbeeld in ApplicationController definiëren. helper :all zegt dat elke methode die je definieert in een helperbestand in de app/helpers-directory beschikbaar zal zijn voor elke sjabloon.
Antwoord 11
Er zijn twee manieren om dit te doen: ofwel door een module te maken of door de variabele @template te gebruiken. Bekijk dit voor meer details
http://www.shanison.com/?p=305
Antwoord 12
Als u uw application_controller.rb-bestand in dit verandert…
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
include SessionsHelper
end
…dan zijn alle helpers beschikbaar voor alle controllers.
Antwoord 13
Als je alleen ApplicationHelper in je app/helpers
map hebt, dan moet je het in je controller laden met include ApplicationHelper
. Standaard laadt Rails alleen de helpermodule die dezelfde naam heeft als uw controller. (bijv. ArticlesController laadt ArticlesHelper). Als je veel modellen hebt (bijv. Artikelen; Berichten; Categorieën) dan moet je ze allemaal uploaden in je controller. de documenten
Helper
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
Voorbeeld controller
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
Antwoord 14
Probeer include SessionsHelper
op te nemen in ApplicationController
class ApplicationController < ActionController::Base
include SessionsHelper
...
end