2012-01-14 53 views
19

我刚刚在Rails 3.1.1中创建了一个新的Rails应用程序,并且我的应用程序布局未在浏览器中呈现。唯一呈现的是我放入视图中的代码(例如views/public/home.html.erb)。Rails没有呈现我的应用程序布局

它只是渲染通过<%= yield%>传送的内容。例如,本地主机:3000 /大众/ home是只显示此:

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

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

下面是在我的/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> 

这里是我的路线以及:

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 

这里是什么在application_contoller.rb:

class ApplicationController < ActionController::Base 
    protect_from_forgery 

end 

这里是什么在public_controller.rb:

class PublicController < ActionController::Base 
    protect_from_forgery 

    def home 
    end 

    def secret 
    end 
end 

这里是什么在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 

这里还有什么是在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

另外,我已经开始设置巫术了,它会在session/new中呈现应用程序,但不会在我的公共#home动作中呈现。 – 2012-01-14 23:50:39

+0

再次阅读您的问题,如果您不说,请告诉我,“嗯?” :)请显示你的'views/layouts/application.html.erb'文件。您是使用默认布局还是在每个控制器中指定它? – iwasrobbed 2012-01-15 00:08:03

+0

这是完全乱码。对于那个很抱歉。我清理了这个问题并添加了我的layouts/application.html.erb文件。我试图使用默认布局,并没有在任何控制器中指定任何布局。 – 2012-01-15 00:22:24

回答

67

我只是碰到了这个同样的问题我自己和问题只是一个简单的错误。

您的控制器PublicController是“ActionController :: Base”的子类。比你的ApplicationController其他控制器需要从ApplicationController中为了继承了他们的意见application.html.erb布局

如果改变内呈现

PublicController < ActionController::Base 

PublicController < ApplicationController 

它应该工作。

+1

太棒了!有用。 – mainframer 2015-08-13 09:43:13

+1

有些时候会发生:) – suvankar 2016-04-08 21:34:22

+0

哦,是的,你去@knt。 – dps 2016-12-12 22:13:30

4

带着最后一个皱纹进入相同的问题:我重写了子类控制器中的初始化。确保先打电话给'超级':

def initialize 
    super 
    @some_client = SomeClient.new 
end 
def initialize 
    super 
    @some_client = SomeClient.new 
end 
相关问题