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.

118
demandé sur user482594 2010-11-02 23:18:34

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 /

225
répondu Rupert Madden-Abbott 2011-06-18 00:48:30

peut essayer cela aussi...cochez cette case 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
répondu jsp 2017-05-23 11:54:31

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.

4
répondu Andres Freyria 2010-11-02 22:16:45

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
2
répondu Christopher Oezbek 2015-04-21 22:40:23

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

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?
2
répondu bbozo 2015-12-16 08:06:04