5

Sto appena iniziando con Devise e Rails3. Ho l'Authenetication giù e funziona e capisco le basi.Devise render sign => up/in form partial altrove nel codice

A partire da ora nel mio Home Controller che rappresenta la mia Home/Front Page ho due collegamenti uno che si collega a Register => sign_up e uno che cambia in base all'accesso/uscita => sign_in/sign_out.

Tuttavia, non desidero reindirizzare il mio utente alla pagina di accesso. Invece voglio mostrare il mio modulo di login sulla mia prima pagina. Quindi ho separato il modello devise/session/new con una vista e un partial _form.html.erb.

E ora, a mio avviso a casa mi rendo form di login come così:

<% if user_signed_in? %> 
    Welcome: <b><%= current_user.username %> (<%= current_user.group.name %>)</b> 
    <%= link_to "Logout", destroy_user_session_path, :method => 'delete' %> 
<% else %> 
    <%= render 'devise/sessions/form' %> // Rendering the partial here 
    <%= link_to "Login", new_user_session_path %> 
<% end %> 
<hr> 

Questo è il codice del parziale:

<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %> 
    <div><%= f.label :email %><br /> 
    <%= f.email_field :email, :autofocus => true %></div> 

    <div><%= f.label :password %><br /> 
    <%= f.password_field :password %></div> 

    <% if devise_mapping.rememberable? -%> 
    <div><%= f.check_box :remember_me %> <%= f.label :remember_me %></div> 
    <% end -%> 

    <div><%= f.submit "Sign in" %></div> 
<% end %> 

Il mio errore è la seguente:

NameError in Home#index 

Showing devise/sessions/_form.html.erb where line #1 raised: 

undefined local variable or method `resource' for #<#<Class:0x614ec68>:0x6157ff8> 
Extracted source (around line #1): 

1: <%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %> 
2: <div><%= f.label :email %><br /> 
3: <%= f.email_field :email, :autofocus => true %></div> 
4: 

Capisco perché si verifica l'errore. È perché al parziale non viene assegnato l'attributo della risorsa. Ho usato dump(resource) e si scopre che è un modello di utente/oggetto Così ho aggiunto il seguente prima:

<% if @user %> 
    <% resource = @user %> 
<% end %> 

e ha aggiunto in seguito alla mia casa metodo index del controller:

def index 
    @user = User.new 
end 

Tuttavia dopo che ottengo nome_risorsa errore che risulta essere semplicemente :user e se lo imposto ottengo un problema a causa di devise_mapping.rememberable? che non so come fornire.

Voglio farlo correttamente, quindi voglio evitare un approccio disordinato e disordinato che ho iniziato.

risposta

17

Date un'occhiata alla risposta a questa domanda: Devise form within a different controller

La forma si sta tentando di rendere con il controller casa si basa su aiutanti definiti da Devise che non sono accessibili da un controller non Devise.

Aggiungendo gli aiutanti necessari con l'home_helper.rb dovrebbe risolvere il problema:

def resource_name 
:user 
end 

def resource 
@resource ||= User.new 
end 

def devise_mapping 
@devise_mapping ||= Devise.mappings[:user] 
end 
4

sto usando Devise 3.5.1 e ho dovuto aggiungere resource_class pure per ottenere il modulo di accesso che lavora su un diverso controller.

L'ho aggiunto a application_helper.rb quindi si applica a tutti i miei controller.

def resource_name 
    :user 
end 

def resource 
    @resource ||= User.new 
end 

def devise_mapping 
    @devise_mapping ||= Devise.mappings[:user] 
end 

def resource_class 
    devise_mapping.to 
end 
Problemi correlati