web-dev-qa-db-fra.com

Concevoir une forme dans un autre contrôleur

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.

123
user482594

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/

232

Peut essayer cela aussi ... vérifier ceci question .

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 %> 
8
jsp

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.

4
Andres Freyria

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

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?
3
bbozo

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
2
Christopher Oezbek