Diseñar formulario dentro de un controlador diferente

Estoy usando una joya de diseño para los procedimientos de sign_in / sign_out.

Genere archivos de vistas desde el dispositivo, usando rails g devise views

Vi que había un archivo ide / sessions / new.html.erb que contenía un formulario para sign_in.

Creé otro archivo idear / sessions / _form.html.erb e hice dentro de un archivo new.html.erb, y funcionó muy bien.

Ahora, quería incluir este formulario desde el controlador diferente. Entonces, en un controlador llamado ‘main’, (específicamente, dentro de la página de visualización) ‘mains / index.html.erb’, incluí file. Parece que la inclusión funcionó bien, pero me aparece el siguiente error.

 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:

Parece que form_for (resource, …) parte está causando el problema (que funciona bien si estoy en el diseño original de la página de inicio de sesión … ¿Cómo puedo resolver este problema en forma de Rails?

Personalmente prefiero usar la función ‘render’ para incluir el formulario, en lugar de escribir códigos html en línea.

¿Debo especificar algo (recurso) dentro del controlador ‘principal’?

Apreciaré su ayuda. Gracias.

Como dice Andrés, el formulario llama a ayudantes especificados por Devise y, por lo tanto, no están presentes cuando accedes a un formulario Devise desde un controlador que no es Devise.

Para evitar esto, debe agregar los siguientes métodos a la clase auxiliar del controlador en el que desea mostrar el formulario. De forma alternativa, puede agregarlos a su asistente de aplicaciones para que estén disponibles en cualquier lugar.

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

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

Puede intentar esto también … verifique esta pregunta .

Fuente

 < %= 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 forma que creó funciona cuando se representa desde un controlador Devise porque “recurso” se define a través de Devise. Eche un vistazo a la implementación de Devise SessionsController : por lo que entiendo, está intentando replicar la “nueva” acción. El método “build_resource” es probablemente lo que estás buscando.

La gem Warden es de donde provienen los objetos de “recursos”. Si deseas cavar más profundo, ese sería el lugar para mirar.

Obtuve el mismo error de undefined local variable or method "resource" que describe desde uno de mis controladores, porque a mi clase base de controlador le faltaba lo siguiente (Rails-API ActionController :: API tuvo la culpa):

 include ActionController::Helpers 

Por lo tanto, los métodos auxiliares de Devise no se pudieron resolver en la vista.

Para hacer que Devise trabaje con Rails-API, necesitaba incluir:

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

Para refinar en la respuesta aceptada, utilizamos esta herramienta para permitir diferentes tipos de recursos:

 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 

donde admin_controller? es algo que tenemos desde antes en ApplicationController para manejar los redireccionamientos de inicio de sesión:

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