Ich verwende ein Juwel für sign_in / sign_out-Prozeduren.
Ich habe Views-Dateien von devise mit generiert rails g devise views
Ich habe gesehen, dass es eine Datei devise / session / new.html.erb gibt, die ein Formular für sign_in enthält.
Ich habe eine andere Datei devise / session / _form.html.erb erstellt und dies <%= render 'form' %>
in einer new.html.erb-Datei getan, und das hat sehr gut funktioniert.
Jetzt wollte ich dieses Formular von den verschiedenen Controllern einfügen. Also habe ich in einem Controller namens 'main' (speziell innerhalb der Ansichtsseite) 'mains / index.html.erb' eine <%= render 'devise/sessions/form' %>
Datei eingefügt . Es scheint, dass die Aufnahme gut funktioniert hat, aber ich erhalte den folgenden Fehler.
NameError in Mains#index
Showing /home/administrator/Ruby/site_v4_ruby/app/views/devise/sessions/_form.html.erb where line #1 raised:
undefined local variable or method `resource' for #<#<Class:0x007f1aa042d530>:0x007f1aa042b870>
Extracted source (around line #1):
1: <%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
2: <p><%= f.label :email %><br />
3: <%= f.text_field :email %></p>
4:
Es scheint, dass der Teil form_for (resource, ...) das Problem verursacht (was gut funktioniert, wenn ich mich auf der ursprünglichen Anmeldeseite des Geräts befinde ... Wie kann ich dieses Problem auf Schienen lösen?
Ich persönlich bevorzuge die Verwendung der Renderfunktion, um das Formular einzuschließen, anstatt HTML-Codes inline zu schreiben.
Muss ich im Hauptcontroller etwas (Ressource) angeben?
Ich werde Ihre Hilfe schätzen. Danke dir.
quelle
Antworten:
Wie Andres sagt, ruft das Formular Helfer auf, die von Devise angegeben wurden und daher nicht vorhanden sind, wenn Sie von einem Nicht-Devise-Controller auf ein Devise-Formular zugreifen.
Um dies zu umgehen, müssen Sie der Hilfsklasse des Controllers, unter dem Sie das Formular anzeigen möchten, die folgenden Methoden hinzufügen. Alternativ können Sie sie einfach zu Ihrem Anwendungshelfer hinzufügen, um sie überall verfügbar zu machen.
Quelle: http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/
quelle
inherited_resources
.helper_method :resource_name, :resource_class, :resource, :devise_mapping
(dies:resource_class
scheint in neueren Devise-Versionen erforderlich zu sein).Kann das auch versuchen ... überprüfe diese Frage .
Quelle
quelle
Das von Ihnen erstellte Formular funktioniert beim Rendern von einem Devise-Controller, da "Ressource" über Devise definiert wird. Schauen Sie sich die Implementierung des Devise SessionsController an. Soweit ich weiß, versuchen Sie, die "neue" Aktion zu replizieren. Die Methode "build_resource" ist wahrscheinlich das, wonach Sie suchen.
Der Warden- Edelstein ist der Ort, von dem die "Ressourcen" -Objekte stammen. Wenn Sie tiefer graben möchten, ist dies der richtige Ort für Sie.
quelle
Um die akzeptierte Antwort zu verfeinern, verwenden wir diesen Helfer, um verschiedene Arten von Ressourcen zuzulassen:
wo
admin_controller?
ist etwas , das wir aus , bevor sie in die habenApplicationController
zu Griff Login Umleitungen:quelle
Ich habe den gleichen Fehler erhalten, den
undefined local variable or method "resource"
Sie von einem meiner Controller beschrieben haben, weil in meiner Controller-Basisklasse Folgendes fehlte (Rails-API ActionController :: API war fehlerhaft):Daher konnten die Hilfsmethoden von Devise in der Ansicht nicht aufgelöst werden.
Damit Devise mit der Rails-API funktioniert, musste ich Folgendes einschließen:
quelle