127 votes

Concevoir un formulaire au sein d'un contrôleur différent

J'utilise une gemme devise pour les procédures d'inscription et de départ.

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 un fichier devise/sessions/new.html.erb qui contenait un formulaire d'inscription.

J'ai créé un autre fichier devise/sessions/_form.html.erb et fait <%= render 'form' %> dans un fichier new.html.erb, et cela a très bien fonctionné.

Maintenant, je voulais inclure ce formulaire à partir d'un autre contrôleur. 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' %> dossier. Il semble que l'inclusion ait 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 la partie form_for(resource,...) soit à l'origine du problème (qui fonctionne bien si je suis sur la page d'inscription originale de devise...). Comment puis-je résoudre ce problème en utilisant des rails ?

Je préfère personnellement 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.

238voto

Rupert Madden-Abbott Points 4068

Comme le dit Andres, le formulaire appelle des aides qui sont spécifiées par Devise et qui ne sont donc pas présentes lorsque vous accédez à un formulaire Devise depuis un contrôleur non Devise.

Pour contourner ce problème, vous devez ajouter les méthodes suivantes à la classe d'aide du contrôleur sous lequel vous souhaitez afficher le formulaire. Vous pouvez également les ajouter à l'aide de votre application pour qu'elles soient disponibles partout.

  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/

8voto

jsp Points 682

Vous pouvez aussi essayer ceci... vérifiez ceci pregunta .

Source :

<%= 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 %>

4voto

Andres Freyria Points 159

Le formulaire que vous avez créé fonctionne lorsqu'il est rendu à partir d'un contrôleur Devise, car la "ressource" est définie par Devise. Jetez un coup d'œil à l'implémentation de l'élément Devise SessionsController - D'après ce que je comprends, vous essayez de reproduire l'action "new". La méthode "build_resource" est probablement celle que vous recherchez.

El Warden gem est l'origine des objets "ressources". Si vous souhaitez creuser davantage, c'est là qu'il faut chercher.

3voto

bbozo Points 2090

Pour affiner la réponse acceptée, nous utilisons cette aide 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

admin_controller? est quelque chose que nous avons déjà vu dans le ApplicationController pour gérer les redirections de connexion :

def admin_controller?
  !devise_controller? and request.path =~ /^\/admin/
end
helper_method :admin_controller?

2voto

Christopher Oezbek Points 2691

Je recevais la même erreur undefined local variable or method "resource" que vous décrivez à partir de l'un de mes contrôleurs, parce qu'il manquait à ma classe de base de contrôleur les éléments suivants (la faute à Rails-API ActionController::API) :

include ActionController::Helpers

Ainsi, les méthodes d'aide de Devise n'ont pas pu ê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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X