NoMethodError bij het aanroepen van de helpermethode van de Rails-controller

Ik krijg een NoMethodErrorwanneer 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 helpermet het symbool :allzoals 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 includein 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 :allmaakt 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 :allmaakt 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_contextmethode 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/helpersmap 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 SessionsHelperop te nemen in ApplicationController

class ApplicationController < ActionController::Base
  include SessionsHelper
  ...
end

Other episodes