5

Właśnie zaczynam od Devise i Rails3. Mam authenetykację i pracuję i rozumiem podstawy.Wywołaj renderowanie znaku => w górę/w częściowej części gdzie indziej w kodzie

Obecnie w moim kontrolerze głównym, który reprezentuje moją stronę główną/stronę główną, mam dwa łącza, które prowadzą do Register => sign_up i jednego, który zmienia się w zależności od logowania/wylogowania => sign_in/sign_out.

Jednak nie chcę przekierowywać mojego użytkownika na stronę logowania. Zamiast tego chcę wyświetlić mój formularz logowania na mojej stronie głównej. Oddzieliłem szablon int devise/session/new na widok i część _form.html.erb.

A teraz moim zdaniem domu i uczynić formularz logowania, jak tak:

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

Jest to kod częściowej:

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

Mój błąd jest w następujący sposób:

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: 

Rozumiem, dlaczego wystąpił błąd. Dzieje się tak dlatego, że częściowemu temu nie nadano atrybutu zasobu. Kiedyś dump(resource) i okazuje się, że jest to model User/przedmiot więc dodałem następujące przed nim:

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

I dodaje się następujące mój dom metody indeksu kontrolera:

def index 
    @user = User.new 
end 

Jednak po tym ja dostać resource_name błąd, który okazuje się po prostu być :user i jeśli ustawię, to mam problem z powodu devise_mapping.rememberable?, którego nie wiem, jak zapewnić.

Chcę to zrobić właściwie, więc chcę uniknąć niechlujnego i nielogicznego podejścia, które zacząłem.

Odpowiedz

17

Spójrz na odpowiedź na to pytanie: Devise form within a different controller

Formularz próbujesz renderowania z kontrolera Home opiera się na określonych przez pomocników opracować, które nie są dostępne z kontrolerem nie wymyślają.

Dodawanie niezbędnych pomocników do swojej home_helper.rb powinno rozwiązać problem:

def resource_name 
:user 
end 

def resource 
@resource ||= User.new 
end 

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

Używam Devise 3.5.1 i musiałem dodać resource_class również uzyskać formularz logowania pracuje na inny kontroler.

Dodałem go do application_helper.rb, więc ma zastosowanie do wszystkich moich kontrolerów.

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 
Powiązane problemy