5

Ich fange gerade mit Devise und Rails3. Ich habe die Authenetication runter und arbeite und verstehe die Grundlagen.Devise Render-Zeichen => oben/in Form Teil an anderer Stelle in Code

Ab sofort in meinem Home Controller, der meine Startseite/Startseite darstellt, habe ich zwei Links, die mit Register => sign_up verknüpft sind und eine, die sich je nach Login/Logout => sign_in/sign_out ändert.

Allerdings möchte ich nicht meinen Benutzer zur Anmeldeseite umleiten. Stattdessen möchte ich mein Login-Formular auf meiner Startseite anzeigen. Also habe ich die devise/session/new Vorlage int in eine Ansicht und eine _form.html.erb teilweise getrennt.

Und jetzt in meinem Hause Ansicht mache ich das Login-Formular wie so:

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

Dies ist der Code des Teils ist:

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

Mein Fehler ist wie folgt:

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: 

Ich verstehe, warum der Fehler passiert. Das liegt daran, dass dem Partial das Ressourcenattribut nicht zugewiesen wurde. Ich benutzte dump(resource) und es stellt sich heraus, es ist ein User-Modell/object, damit ich die folgenden Punkte, bevor er hinzugefügt:

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

und fügte folgendes my Home Controller Index-Methode:

def index 
    @user = User.new 
end 

jedoch nach, dass ich bekommen resource_name Fehler, der einfach :user ist, und wenn ich das setze, dann bekomme ich ein Problem wegen devise_mapping.rememberable?, die ich weiß nicht, wie man zur Verfügung stellt.

Ich möchte das richtig machen, also möchte ich chaotischen und unlogischen Ansatz vermeiden, den ich angefangen habe.

Antwort

17

Werfen Sie einen Blick auf die Antwort auf diese Frage: Devise form within a different controller

Das Formular, das Sie mit Ihrem Home-Controller von Devise setzt definiert auf Helfer zu machen versuchen, die nicht zugänglich von einem Nicht-Devise Controller sind.

die notwendigen Helfer zu Ihrem home_helper.rb Hinzufügen sollte Ihr Problem lösen:

def resource_name 
:user 
end 

def resource 
@resource ||= User.new 
end 

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

Ich verwende Devise 3.5.1 und ich hatte resource_class auch hinzufügen, um die Login-Formular auf einem anderen zum Laufen zu bringen Regler.

Ich habe es zu application_helper.rb hinzugefügt, so dass es für alle meine Controller gilt.

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