J'utilise un bijou de carte pour les procédures de sign_in/sign_out.
J'ai généré des fichiers de vues à partir de concevez, en utilisant Rails g devise views
J'ai vu qu'il y avait un fichier conce/sessions/new.html.erb qui contenait un formulaire pour sign_in.
J'ai créé un autre fichier invent/sessions/_form.html.erb et ai fait <%= render 'form' %>
dans un fichier new.html.erb, et cela a très bien fonctionné.
Maintenant, je voulais inclure ce formulaire à partir des différents contrôleurs. Ainsi, dans un contrôleur appelé 'main', (spécifiquement dans la page de vue) 'mains/index.html.erb', j'ai inclus <%= render 'devise/sessions/form' %>
fichier. Il semble que l'inclusion a bien fonctionné, mais je reçois l'erreur suivante.
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:
Il semble que cette partie forme_for (ressource, ...) soit à l'origine du problème (ce qui fonctionne bien si je suis sur la page originale de sign_in de carte ... Comment puis-je résoudre ce problème de manière Rails ?
Personnellement, je préfère utiliser la fonction 'render' pour inclure le formulaire, plutôt que d'écrire des codes HTML en ligne.
Dois-je spécifier quelque chose (ressource) dans le contrôleur "principal"?
J'apprécierai votre aide. Merci.
Comme Andres le dit, le formulaire appelle des assistants spécifiés par Devise et ne sont donc pas présents lorsque vous accédez à un formulaire Devise à partir d'un contrôleur non-Devise.
Pour résoudre ce problème, vous devez ajouter les méthodes suivantes à la classe d'assistance du contrôleur sous lequel vous souhaitez afficher le formulaire. Sinon, vous pouvez simplement les ajouter à votre application auxiliaire pour les rendre disponibles n'importe où.
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
Source: http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/
Peut essayer cela aussi ... vérifier ceci question .
<%= form_for("user", :url => user_session_path) do |f| %>
<%= f.text_field :email %>
<%= f.password_field :password %>
<%= f.check_box :remember_me %>
<%= f.label :remember_me %>
<%= f.submit 'Sign in' %>
<%= link_to "Forgot your password?", new_password_path('user') %>
<% end %>
Le formulaire que vous avez créé fonctionne lorsqu'il est rendu à partir d'un contrôleur Devise car "ressource" est défini dans Devise. Jetez un coup d'œil à la mise en œuvre de Devise SessionsController - d'après ce que j'ai compris, vous essayez de reproduire la "nouvelle" action. La méthode "build_resource" est probablement ce que vous cherchez.
Le joyau Warden est l’origine des objets "ressources". Si vous souhaitez creuser plus profondément, ce serait l'endroit à regarder.
Pour affiner la réponse acceptée, nous utilisons cet assistant pour autoriser différents types de ressources:
def resource_name
@resource_name ||= if admin_controller?
:admin_user
else
:user
end
end
def resource
@resource ||= resource_name.to_s.classify.constantize.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[resource_name]
end
où admin_controller?
est quelque chose que nous avons déjà dans le ApplicationController
pour gérer les redirections de connexion:
def admin_controller?
!devise_controller? and request.path =~ /^\/admin/
end
helper_method :admin_controller?
J'avais la même erreur undefined local variable or method "resource"
vous décrivez l'un de mes contrôleurs, car il manquait ce qui suit dans la classe de base de mon contrôleur (ActionController Rails-API: API était en cause):
include ActionController::Helpers
Ainsi, les méthodes d'assistance de Devise ne pouvaient pas être résolues dans la vue.
Pour que Devise fonctionne avec Rails-API, je devais inclure:
class ApplicationController < ActionController::API
include AbstractController::Rendering
include AbstractController::Layouts
include ActionController::MimeResponds
include AbstractController::Translation
include ActionController::ImplicitRender
include ActionController::Helpers