2012-02-16 19 views
5

Estoy tratando de incluir un inicio de sesión (nombre de usuario/contraseña) en el encabezado de mi application.html.erb. Estoy consiguiendo este error:Rails 3 render parcial desde otro controlador (error: ActionView :: MissingTemplate)

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

Esto sucede cuando hago esta llamada en mi application.html.erb:

<%= render '/login' %> 

'/ login' se define en mi routes.rb como:

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

ACTUALIZACIÓN: aquí está mi controlador de sesiones:

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 

He visto en otras publicaciones que esto puede deberse a que no se define una variable en una acción de controlador, pero como esta es una sesión, y está en la aplicación.html.erb (application_controller.rb), no estoy seguro de cómo hacer esto. ¿Alguien sabe cómo hacer esto? ¡Gracias!

+0

¿dónde se encuentra exactamente tu parcial? Y, ¿por qué estás asignando una ruta de rutas en tu render? – prasvin

+0

el parcial está en views/sessions/new.html.erb. La razón por la que estoy usando '/ login' en mi invocación para renderizar es porque pensé que haría que las vistas/sessions/new.html.erb fueran parciales. – botbot

+0

ver la respuesta actualizada – prasvin

Respuesta

9

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

rendirá entrada parcial de sesiones de visión, es decir, '_login.html.erb' en vistas/sesiones e instanciar @user a nuevo usuario de modo que se pueda hacer referencia directamente en la parcial como:

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

actualicé mi publicación para mostrar el código de mi controlador de sesiones. Soy muy nuevo en esto, así que no entiendo por qué debería pasar un @user => User.new? es así que la línea: si user = User.authenticate (params [: email], params [: password]) no fallará en el controlador de sesión? Estaba siguiendo un tutorial en el que tuve que agregar un archivo new.html.erb a la carpeta my/sessions, pero ahora que miro mi controlador, solo tiene un método de creación y otro de detroy. un poco confuso – botbot

+0

Si está tratando de crear algún tipo de sistema de autentificación con esto, realmente recomiendo usar la gema Devise https://github.com/plataformatec/devise. Es súper fácil y muy, muy útil. Crea la sesión por sí mismo, proporciona ayudantes útiles (como current_user) y nos libera de la gestión de la molestia de la sesión. Preferiría dejar la parte de autentificación a Devise. De esta forma, si el usuario no está autenticado, Devise lo redirigirá a la página de inicio de sesión. Ahora puede diseñar la página de inicio de sesión como desee y renderizar el inicio de sesión (nombre de usuario/contraseña) donde quiera. – prasvin

+1

Ahora, yendo directamente a su pregunta, sugiero crear un '_login.html.erb' parcial en vistas/sesiones. Luego, renderice el inicio de sesión parcial como arriba. El motivo por el que se pasa '@ user' es porque el parcial tiene un formulario para' @ user', por lo que se crea una instancia con 'User.new'. Complete el formulario parcial con el usuario, como se muestra arriba, que contiene correo electrónico, contraseñas y, si es necesario, algunos otros campos. Cuando se envía el formulario, los parámetros se pasan a las sesiones # create becoz de la url especificada en el formulario. El código no ha sido probado, pero debería ayudar. Pero, por favor, eche un vistazo a Devise primero y utilícelo si se ajusta a sus requisitos. – prasvin

0

Compruebe su extensión de archivo en mi caso era la extensión de archivo RHTML, he cambiado en html.erb.

Ahora funciona bien.

Nota:

Este archivo con extensión RHTML estaba trabajando bien en rieles < = 3.0.10. Pero dejó de funcionar en carriles 3.1.12. Así que cambié su extensión como se menciona arriba.

Cuestiones relacionadas