2012-02-16 28 views
5

Próbuję dołączyć login (nazwa użytkownika/hasło) w nagłówku mojego application.html.erb. Dostaję taki błąd:Rails 3 renderowanie częściowe z innego kontrolera (błąd: ActionView :: MissingTemplate)

Missing partial /login with {:handlers=>[:rjs, :builder, :rhtml, :erb, :rxml], :locale=>[:en, :en], :formats=>[:html]} in view paths "/app/views" 

Tak się dzieje, gdy robię to wezwanie w moim application.html.erb:

<%= render '/login' %> 

'/ login' jest zdefiniowane w moim routes.rb jak:

match '/login' => "sessions#new", :as => "login" 

UPDATE: tu jest mój kontroler sesje:

class SessionsController < ApplicationController 

    def create 
    if user = User.authenticate(params[:email], params[:password]) 
     session[:user_id] = user.id 
     user.last_login = Time.now 
     user.save 
     redirect_to root_path, :notice => "login successful" 
     else 
     flash.now[:alert] = "invalid login/password combination " # don't show pass + params[:password] 
     #render :action => "new" 
     redirect_to login_path, :notice => "wrong user pass" 
     end 
    end 

    def destroy 
    reset_session 
     redirect_to root_path, :notice => "successfully logged out" 
    end 

end 

Widziałem w innych postach, że może to wynikać z braku zdefiniowania zmiennej w działaniu kontrolera, ale ponieważ jest to sesja i jest ona w application.html.erb (application_controller.rb), nie jestem na pewno, jak to zrobić. Ktoś wie jak to zrobić? Dzięki!

+0

gdzie dokładnie znajduje się twój produkt? I dlaczego przypisujesz ścieżkę tras do swojego renderowania? – prasvin

+0

częściowe jest w views/sessions/new.html.erb. Powodem, dla którego używam "/ login" w moim wywołaniu renderowania jest to, ponieważ uznałem, że spowodowałoby częściowe widoki views/sessions/new.html.erb. – botbot

+0

zobacz zaktualizowaną odpowiedź – prasvin

Odpowiedz

9

<%= render "sessions/login", :@user => User.new %>

odda logowanie częściowy sesji przeglądania, czyli „” w widokach _login.html.erb/sesji i wystąpień @user do nowego użytkownika, aby mógł on być odniesione bezpośrednio w częściowej jak:

form_for @user, :url => sessions_path do |f| 
    f.text_field :email 
+0

zaktualizowałem mój post, aby wyświetlić kod kontrolera sesji. Jestem trochę nowy w tym, tak naprawdę nie rozumiem, dlaczego musiałbym przekazać: @user => User.new? jest tak linia: jeśli użytkownik = User.authenticate (parametry [: email], parametry [: hasło]) nie zawiedzie w sterowniku sesji? Podążałem za tutorialem, w którym musiałem dodać nowy.html.erb do folderu my/sessions, ale teraz, gdy patrzę na kontroler, ma on tylko metodę create i detroy. trochę mylące. – botbot

+0

Jeśli próbujesz stworzyć z tego jakiś system uwierzytelniania, naprawdę polecam używanie klejnotu Devise https://github.com/plataformatec/devise. Jest bardzo łatwy i bardzo pomocny. Tworzy sesję samodzielnie, dostarcza użytecznych pomocników (takich jak current_user) i pozwala nam uwolnić się od zarządzania problemami z sesją. Wolę pozostawić część uwierzytelniającą Devise. W ten sposób, jeśli użytkownik nie zostanie uwierzytelniony, program Devise przekieruje go na stronę logowania. Teraz możesz zaprojektować stronę logowania tak, jak chcesz i wylogować się (nazwa użytkownika/hasło) w dowolnym miejscu. – prasvin

+1

Teraz idąc prosto do twojego pytania, proponuję utworzyć częściowe '_login.html.erb' w widokach/sesjach. Następnie zrenderuj logowanie częściowe jak wyżej. Powód '@ user' jest przekazywany, ponieważ częściowa ma postać dla' @ user', więc jest tworzona z 'User.new'. Wypełnij częściowy formularz dla użytkownika, jak pokazano powyżej, zawierający adres e-mail, hasła i, jeśli trzeba, kilka innych pól. Po przesłaniu formularza parametry są przekazywane do sesji # create becoz z adresu URL określonego w formularzu. Kod jest nieprzetestowany, ale powinien pomóc. Ale najpierw zapoznaj się z Devise i użyj go, jeśli spełnia wymagania. – prasvin

0

Sprawdź rozszerzenie pliku w moim rozszerzeniem sprawa była rhtml, zmieniłem go na html.erb.

Teraz działa dobrze.

Uwaga:

Plik z rhtml rozszerzenie działa dobrze w szynach < = 3.0.10. Ale przestał działać w szynach 3.1.12. Więc zmieniłem jego rozszerzenie, jak wspomniano powyżej.

Powiązane problemy