Devise form dentro de um controlador diferente

Eu estou usando uma jóia para procedimentos sign_in / sign_out.

Eu gerava arquivos de visão do devise, usando rails g devise views

Vi que havia um arquivo devise / sessions / new.html.erb que continha um formulário para sign_in.

Eu criei outro arquivo devise / sessions / _form.html.erb e fiz dentro de um arquivo new.html.erb, e isso funcionou muito bem.

Agora, eu queria include este formulário do controlador diferente. Então, em um controller chamado ‘main’, (especificamente, dentro da página de visualização) ‘mains / index.html.erb’ eu incluí o 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 #<#:0x007f1aa042b870> Extracted source (around line #1): 1:  resource_name, :url => session_path(resource_name)) do |f| %> 2: 


3:

4:

Parece que a parte form_for (resource, …) está causando o problema (o que funciona bem se eu estiver na página original do sign_in … Como posso resolver esse problema de maneira rails?

Eu pessoalmente prefiro usar a function ‘render’ para include o formulário, em vez de escrever códigos html em linha.

Eu tenho que especificar algo (recurso) dentro do controlador ‘principal’?

Eu apreciarei sua ajuda. Obrigado.

Como diz Andres, o formulário chama helpers que são especificados pelo Devise e, portanto, não estão presentes quando você acessa um formulário do Devise a partir de um controlador que não seja o Devise.

Para contornar isso, você precisa adicionar os seguintes methods à class auxiliar do controlador no qual deseja exibir o formulário. Alternativamente, você pode simplesmente adicioná-los ao seu aplicativo para disponibilizá-los em qualquer lugar.

  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/

Pode tentar isso também … verifique esta questão .

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

O formulário que você criou funciona quando renderizado a partir de um controlador do 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 é de onde os objects “resources” estão vindo. Se você quiser cavar mais fundo, esse seria o lugar para procurar.

Eu estava recebendo o mesmo erro undefined local variable or method "resource" você descreve de um dos meus controladores, porque minha class base do controlador estava faltando o seguinte (Rails-API ActionController :: API estava com defeito):

 include ActionController::Helpers 

Assim, os methods auxiliares do Devise não puderam ser resolvidos na exibição.

Para fazer o Devise funcionar com o Rails-API, eu precisava include:

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

Para refinar a resposta aceita, usamos esse auxiliar para permitir diferentes tipos de resources:

 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 

onde admin_controller? é algo que temos de antes no ApplicationController para lidar com redirecionamentos de login:

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