Estoy usando una gema de diseño para los procedimientos de inicio de sesión / inicio de sesión.
Genere archivos de vistas desde el dispositivo, usando rails g devise views
Vi que había un archivo de idear / sessions / new.html.erb que contenía un formulario para sign_in.
Creé otro archivo idear / sessions / _form.html.erb y lo hice <%= render 'form' %>
dentro de un nuevo archivo.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 vista) 'mains / index.html.erb' incluí el <%= render 'devise/sessions/form' %>
archivo. Parece que la inclusión funcionó bien, pero recibo 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 #<#<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:
Parece que la parte form_for (recurso, ...) está causando el problema (que funciona bien si estoy en la página de inicio de sesión del dispositivo original ... ¿Cómo puedo resolver este problema en forma de rieles?
Personalmente prefiero usar la función 'render' para incluir el formulario, en lugar de escribir códigos html en línea.
¿Tengo que especificar algo (recurso) dentro del controlador 'principal'?
Apreciaré su ayuda. Gracias.
fuente
Respuestas:
Como dice Andrés, el formulario llama a los ayudantes especificados por Devise y, por lo tanto, no están presentes cuando accede a un formulario de 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. Alternativamente, puede agregarlos a su aplicación auxiliar para que estén disponibles en cualquier lugar.
Fuente: http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/
fuente
inherited_resources
.helper_method :resource_name, :resource_class, :resource, :devise_mapping
(:resource_class
parece ser un requisito en las versiones más nuevas de Devise).Puede probar esto también ... verifique esta pregunta .
Fuente
fuente
El formulario 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á buscando.
La gema Warden es de donde provienen los objetos de "recurso". Si desea profundizar, ese sería el lugar para buscar.
fuente
Para refinar la respuesta aceptada, utilizamos este ayudante para permitir diferentes tipos de recursos:
¿De dónde
admin_controller?
es algo que tenemos antesApplicationController
para manejar las redirecciones de inicio de sesión?fuente
Recibí el mismo error que
undefined local variable or method "resource"
usted describe de uno de mis controladores, porque a mi clase base de controlador le faltaba lo siguiente (Rails-API ActionController :: API tenía la culpa):Por lo tanto, los métodos auxiliares de Devise no se pudieron resolver en la vista.
Para que Devise funcione con Rails-API, necesitaba incluir:
fuente