2012-01-14 10 views
19

Ho appena creato una nuova app per rails in Rails 3.1.1 e il layout dell'applicazione non viene visualizzato nel browser. L'unica cosa che viene renderizzata è il codice che inserisco nelle viste (ad esempio views/public/home.html.erb).Rails non sta rendendo il layout dell'applicazione

È solo il rendering di ciò che viene convogliato attraverso <% = rendimento%>. Per esempio, localhost: 3000/pubblico/home è sulla visualizzazione solo questo:

<h1>Homepage</h1> 
<h2>Here we go.</h2> 

<a href="/#">Visit the login page</a> 

Ecco cosa c'è nel mio /layouts/application.html.erb:

<!DOCTYPE html> 
<html> 
<head> 
    <title>My App</title> 
    <%= stylesheet_link_tag "application" %> 
    <%= javascript_include_tag "application" %> 
    <%= csrf_meta_tags %> 
</head> 
<body> 

    <ul class="user_nav"> 
    <% if current_user %> 

     <li> 
     Logged in as <%= current_user.email %>. 
     </li> 
     <li> 
     <%= link_to "Log out", logout_path %> 
     </li> 
    <% else %> 
     <li> 
     <%= link_to "Sign up", signup_path %> 
     </li> 
     <li> 
     <%= link_to "Log in", login_path %> 
     </li> 
    <% end %> 
    </ul> 


    <% flash.each do |name, msg| %> 
    <%= content_tag :div, msg, :id => "flash#{name}" %> 
    <% end %> 

    <%= yield %> 

    <h1>test!</h1> 


</body> 
</html> 

Qui sono le mie vie come pure:

root :to => "public#home" 
    match "/secret" => "public#secret" 


    get "logout" => "sessions#destroy", :as => "logout" 
    get "login" => "sessions#new", :as => "login" 
    get "signup" => "users#new", :as => "signup" 
    resources :users 
    resources :sessions 

Ecco cosa c'è in application_contoller.rb:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

end 

Ecco cosa c'è in public_controller.rb:

class PublicController < ActionController::Base 
    protect_from_forgery 

    def home 
    end 

    def secret 
    end 
end 

Ecco cosa c'è in sessions_contoller.rb:

class SessionsController < ApplicationController 
    def new 
    end 

    def create 
    user = login(params[:email], params[:password], params[:remember_me]) 
    if user 
     redirect_back_or_to root_path, :notice => "Logged in!" 
    else 
     flash.now.alert = "Email or password was invalid" 
     render :new 
    end 
    end 

    def destroy 
    logout 
    redirect_to root_path, :notice => "Logged out" 
    end 
end 

Ed ecco che cosa è in users_controller.rb:

class UsersController < ApplicationController 
    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     redirect_to root_path, :notice => "Signed up!" 
    else 
     render :new 
    end 
    end 

end 
+0

Inoltre, ho iniziato a impostare Sorcery e rende l'applicazione alle sessioni/nuovo, ma non sulla mia azione home home pubblica. –

+0

Leggi di nuovo la tua domanda e fammi sapere se non dici "Eh?" :) Si prega di mostrare il file 'views/layouts/application.html.erb'. Stai usando il layout predefinito o lo stai specificando in ogni controller? – iwasrobbed

+0

Questo era un totale senza senso. Mi dispiace per quello Ho ripulito la domanda e aggiunto il mio file layout/application.html.erb. Sto tentando di utilizzare il layout predefinito e non ho specificato alcun layout in alcun controller. –

risposta

67

Ho appena incontrato questo stesso problema me stesso e il problema è solo un semplice errore.

Il controllore PublicController è sottoclasse "ActionController :: Base". Controller che non siano l'ApplicationController bisogno di creare una sottoclasse da ApplicationController in ordine per loro punti di vista per essere resi all'interno del layout application.html.erb

Se si cambia

PublicController < ActionController::Base 

a

PublicController < ApplicationController 

dovrebbe lavoro.

+1

Fantastico! Funziona. – mainframer

+1

un po 'di tempo succede :) – suvankar

+0

Oh sì, ci vai @knt. – dps

4

Si è verificato lo stesso problema con una ruga finale: stavo inizializzando l'inizializzazione nel controller sottoclasse. Assicurati di chiamare "super" per prima cosa:

def initialize 
    super 
    @some_client = SomeClient.new 
end 
Problemi correlati