Estou usando uma gema de projeto para procedimentos sign_in / sign_out.
Gerei arquivos de visualizações a partir do dispositivo, usando rails g devise views
Vi que havia um arquivo devise / sessions / new.html.erb que continha um formulário para sign_in.
Criei outro arquivo devise / sessions / _form.html.erb e o fiz <%= render 'form' %>
dentro de um arquivo new.html.erb, e isso funcionou muito bem.
Agora, eu queria incluir este formulário do controlador diferente. Assim, em um controlador chamado 'main', (especificamente, na página de visualização) 'mains / index.html.erb', incluí o <%= render 'devise/sessions/form' %>
arquivo. Parece que a inclusão funcionou bem, mas estou recebendo o seguinte erro.
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 a parte form_for (resource, ...) está causando o problema (o que funciona bem se eu estiver na página original de sign_in do dispositivo ... Como posso resolver esse problema de maneira rails?
Pessoalmente, prefiro usar a função 'render' para incluir o formulário, em vez de escrever códigos html embutidos.
Preciso especificar algo (recurso) dentro do controlador 'principal'?
Agradeço sua ajuda. Obrigado.
fonte
Respostas:
Como Andres diz, o formulário chama os auxiliares especificados pelo Devise e, portanto, não estão presentes quando você acessa um formulário do Devise a partir de um controlador não-Devise.
Para contornar isso, você precisa adicionar os seguintes métodos à classe auxiliar do controlador em que deseja exibir o formulário. Como alternativa, você pode adicioná-los ao auxiliar de aplicativos para disponibilizá-los em qualquer lugar.
Fonte: http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/
fonte
inherited_resources
.helper_method :resource_name, :resource_class, :resource, :devise_mapping
(o que:resource_class
parece ser um requisito nas versões mais recentes do Devise).Pode tentar isso também ... verifique esta pergunta .
Fonte
fonte
O formulário que você criou funciona quando renderizado a partir de um controlador Devise porque "recurso" é definido por meio do Devise. Dê uma olhada na implementação do Devise SessionsController - pelo que entendi, você está tentando replicar a "nova" ação. O método "build_resource" é provavelmente o que você está procurando.
A gema Warden é a origem dos objetos "recursos". Se você quiser ir mais fundo, esse seria o lugar para procurar.
fonte
Para refinar a resposta aceita, usamos esse auxiliar para permitir diferentes tipos de recursos:
onde
admin_controller?
está algo que temos de antes noApplicationController
para lidar com redirecionamentos de login:fonte
Eu estava recebendo o mesmo erro que
undefined local variable or method "resource"
você descreveu em um dos meus controladores, porque estava faltando na minha classe base do controlador (Rails-API ActionController :: API estava com falha):Portanto, os métodos auxiliares do Devise não puderam ser resolvidos na exibição.
Para fazer o Devise funcionar com a API do Rails, eu precisava incluir:
fonte