Elaborare la forma all’interno di un controller diverso

Sto usando una gem devise per le procedure sign_in / sign_out.

Ho generato file di viste da ideare, usando rails g devise views

Ho visto che c’era un file / devise / new.html.erb che conteneva un modulo per sign_in.

Ho creato un altro file devise / sessions / _form.html.erb e ho all’interno di un file new.html.erb, e questo ha funzionato molto bene.

Ora, volevo includere questo modulo dal controller diverso. Quindi in un controller chiamato ‘main’, (in particolare, nella pagina di visualizzazione) ‘main / index.html.erb’ ho incluso file. Sembra che l’inclusione funzioni bene, ma sto ottenendo il seguente errore.

 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 #<#:0x007f1aa042b870> Extracted source (around line #1): 1:  resource_name, :url => session_path(resource_name)) do |f| %> 2: 


3:

4:

Sembra che la parte di form_for (risorsa, …) stia causando il problema (che funziona bene se sono nella pagina di sign_in di devise originale … Come posso risolvere questo problema in modo rotaie?

Personalmente preferisco usare la funzione ‘render’ per includere il modulo, piuttosto che scrivere codici html in linea.

Devo specificare qualcosa (risorsa) all’interno del controller “principale”?

Apprezzerò il tuo aiuto. Grazie.

Come dice Andres, il modulo chiama gli helper che sono specificati da Devise e quindi non sono presenti quando si accede a un modulo Devise da un controller non Devise.

Per ovviare a questo, è necessario aggiungere i seguenti metodi alla class helper del controller in cui si desidera visualizzare il modulo sottostante. In alternativa, puoi semplicemente aggiungerli all’helper dell’applicazione per renderli disponibili ovunque.

  def resource_name :user end def resource @resource ||= User.new end def devise_mapping @devise_mapping ||= Devise.mappings[:user] end 

Fonte: http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/

Puoi provare anche questo … controlla questa domanda .

fonte

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

Il modulo creato funziona quando viene eseguito il rendering da un controller Devise perché “risorsa” è definita tramite Devise. Dai un’occhiata all’implementazione di Devise SessionsController : da quello che ho capito, stai tentando di replicare la “nuova” azione. Il metodo “build_resource” è probabilmente quello che stai cercando.

La gem Warden è da dove vengono gli oggetti “risorsa”. Se vuoi scavare più a fondo, quello sarebbe il posto giusto da guardare.

Stavo ricevendo lo stesso errore undefined local variable or method "resource" che descrivi da uno dei miei controller, perché la mia class base controller mancava quanto segue (Rails-API ActionController :: API era in errore):

 include ActionController::Helpers 

Quindi i metodi di aiuto di Devise non potevano essere risolti nella vista.

Per far funzionare Devise con Rails-API, dovevo includere:

 class ApplicationController < ActionController::API include AbstractController::Rendering include AbstractController::Layouts include ActionController::MimeResponds include AbstractController::Translation include ActionController::ImplicitRender include ActionController::Helpers 

Per perfezionare la risposta accettata, utilizziamo questo helper per consentire diversi tipi di risorse:

 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 

dove admin_controller? è qualcosa che abbiamo da prima in ApplicationController per gestire i reindirizzamenti di login:

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