Concevoir la forme dans un autre contrôleur
j'utilise un gem de devise pour les procédures sign_in/sign_out.
j'ai généré des fichiers de vues à partir de devise, en utilisant rails g devise views
j'ai vu qu'il y avait une devise/sessions/nouveau.HTML.fichier erb contenant un formulaire pour sign_in.
j'ai créé un autre fichier devise/sessions/_form.HTML.erb et n' <%= render 'form' %>
au sein d'un nouveau.HTML.dossier erb, et ça a très bien fonctionné.
Maintenant, je voulais inclure ce formulaire de l'autre contrôleur. Donc dans un controller appelé 'main', (spécifiquement, dans la page de vue) ' mains / index.HTML.erb " j'ai compris "151930920 de fichier". Il semble que l'inscription a bien fonctionné, mais j'obtiens 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 form_for(ressource... partie à l'origine du problème (qui fonctionne très bien si je suis sur la version originale de concevoir sign_in page... Comment résoudre ce problème en chemin de fer?
je préfère personnellement utiliser 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 'main'?
j'apprécierai votre aide. Remercier.
5 réponses
comme dit Andres, le formulaire appelle des helpers qui sont 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 contourner ce problème, vous devez ajouter les méthodes suivantes de la classe d'assistance du contrôleur que vous souhaitez afficher le formulaire. Vous pouvez aussi simplement les ajouter à votre assistant d'application 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...cochez cette case 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 %>
la forme que vous avez créé des œuvres lorsqu'elles sont rendues à partir d'un contrôleur de Devise parce que" ressource " est défini par Devise. Jetez un oeil à la mise en œuvre du concevoir SessionsController - de ce que je comprends, vous essayez de répliquer la "nouvelle" action. La méthode "build_resource" est probablement ce que vous cherchez.
Le Préfet gem est où la "ressource" d'objets sont à venir. Si vous souhaitez creuser plus profondément, ce serait l'endroit à regarder.
je recevais la même erreur undefined local variable or method "resource"
que vous avez décrite d'un de mes contrôleurs, parce que ma classe de base de contrôleur manquait les suivantes (Rails-API ActionController:: API was at fault):
include ActionController::Helpers
ainsi les méthodes d'aide de Devise n'ont pas pu être résolues dans la vue.
pour faire fonctionner le dispositif avec les 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
pour affiner sur la réponse acceptée, nous utilisons cet helper pour permettre 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'avant dans le ApplicationController
pour gérer les redirections de connexion:
def admin_controller?
!devise_controller? and request.path =~ /^\/admin/
end
helper_method :admin_controller?