9 Stimmen

Wie greife ich auf den Helfer "current_user" im Model Rails zu?

Ich muss current_user aufrufen (definiert im ApplicationControler wie ein Helper), in meinem User Modell.

Ich habe ApplicationController.helpers.current_user ausprobiert, aber es funktioniert nicht:

irb(main):217:0> ApplicationController.helpers.current_user
NoMethodError: undefined method `current_user' for nil:NilClass

aber diese Methode funktioniert gut in Controllern und Views...

Also, wie kann ich meinen aktuellen Benutzer im Modell erhalten?

8voto

Simon1901 Punkte 301

Wenn Sie in Ihrem ApplicationController helper_method :current_user aufrufen

class ApplicationController < ActionController::Base
  helper_method :current_user

  def current_user
    @current_user ||= User.find_by(id: session[:user])
  end
end

Dann können Sie es in Ihren Helpers aufrufen

mehr Dokumentation

7voto

user229044 Punkte 220593

Sie können es nicht (oder zumindest wirklich wirklich nicht).

Ihre Modelle haben überhaupt keinen Zugriff auf Ihren derzeit instanziierten Controller. Ihre Modelle sollen so konzipiert sein, dass es möglicherweise nicht einmal eine Anfrage oder einen Benutzer gibt, der interaktiv mit dem System interagiert (denken Sie an ActiveJob).

Sie müssen current_user in Ihre Modellschicht übergeben.


Ihr spezifisches Problem ist, dass Sie etwas namens helpers erfunden haben. Das gibt es nicht, es ist nil, daher erhalten Sie Ihren NoMethodError auf nil:nilClass Fehler. current_user ist eine Instanz Methode, daher müssten Sie sie direkt auf einer Instanz Ihres Controllers aufrufen, nicht auf der Klasse selbst.

7voto

keredson Punkte 2712

Ich habe gerade hier geantwortet: https://stackoverflow.com/a/1568469/2449774

Zur Vereinfachung kopiert:

Mich erstaunen immer die "einfach nicht machen" Antworten von Leuten, die nichts über das zugrunde liegende Geschäftsbedürfnis des Fragestellers wissen. Ja, im Allgemeinen sollte dies vermieden werden. Aber es gibt Umstände, in denen es sowohl angemessen als auch äußerst nützlich ist. Ich hatte selbst gerade erst eine.

Hier war meine Lösung:

def find_current_user
  (1..Kernel.caller.length).each do |n|
    RubyVM::DebugInspector.open do |i|
      current_user = eval "current_user rescue nil", i.frame_binding(n)
      return current_user unless current_user.nil?
    end
  end
  return nil
end

Dies geht den Stapel rückwärts durch und sucht nach einem Rahmen, der auf current_user reagiert. Wenn keiner gefunden wird, gibt es nil zurück. Es könnte robuster gemacht werden, indem der erwartete Rückgabetyp bestätigt wird, und möglicherweise auch der Eigentümer des Rahmens als Controller-Typ bestätigt wird, funktioniert aber im Allgemeinen einfach wunderbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X