Rails 3 - 将模型传递给另一个控制器&在渲染上丢失样式表

时间:2012-03-04 03:22:04

标签: ruby-on-rails ruby-on-rails-3

我正在尝试使用Twitter的Bootstrap为一个小型网站构建一个简单的内容管理系统,我遇到了一个问题的问题。

Rails版本为3.0.10

我想允许用户创建自己的页面,因此我有一个 Pages 控制器,它具有所有标准的RESTful方法。由于这些可以应用于它们,因此只能由登录的管理员访问它们。

所以...我有一个公共控制器设置 @pages @page 实例变量并使用它们显示它们公开展示视图。

这是Public控制器 - 非常简单:

  def index
    @pages = Page.all
  end

  def show
    @pages = Page.all
    @page = Page.find(params[:id])    
  end

'index'方法上有@pages实例变量的原因是因为我有一个加载的欢迎页面,我正在传递@pages以动态填充导航元素:

    <div class="nav-collapse">
          <ul class="nav">
            <li><%= link_to "Welcome", public_index_path, :class => 'active', :id => 'menu_home' %></li>

          <% @pages.each do |page| %>
             <li><%= link_to page.title, public_path(page) %></li>
          <% end %>           

          </ul>
   </div><!--/.nav-collapse -->

公共控制器的“show”方法(包含单个页面)的内容将传递到 applicaton.html.erb 文件中的<%= yield %>语句中:

<div class="container">    

  <%= yield %>
  <hr>

  <footer>
    <p>My site</p>
  </footer>

</div> <!-- /container -->

到目前为止,这个工作正常。

问题是,当我点击将我带到public_path(page)的链接时 - 我会看到它应该出现的内容,但我丢失了所有的样式。我实际上在样式表上遇到404错误:

enter image description here

所有这些样式表都在http://localhost:3000/public页面上正好加载,但是当它转到http://localhost:3000/public/1时 - 那时所有样式都消失了。但是,他们都使用相同的布局。

以下是发出请求时日志文件显示的内容:

Started GET "/public/1" for 127.0.0.1 at 2012-03-03 21:14:49 -0600
  Processing by PublicController#show as HTML
  Parameters: {"id"=>"1"}
  [1m[35mPage Load (1.0ms)[0m  SELECT "pages".* FROM "pages"
  [1m[36mPage Load (0.0ms)[0m  [1mSELECT "pages".* FROM "pages" WHERE "pages"."id" = 1 LIMIT 1[0m
Rendered public/show.html.erb within layouts/application (24.0ms)
Completed 200 OK in 63ms (Views: 51.0ms | ActiveRecord: 1.0ms)


Started GET "/public/stylesheets/bootstrap.css" for 127.0.0.1 at 2012-03-03 21:14:50 -0600

ActionController::RoutingError (No route matches "/public/stylesheets/bootstrap.css"):


Rendered c:/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/actionpack-3.0.10/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (2.0ms)


Started GET "/public/stylesheets/bootstrap-responsive.css" for 127.0.0.1 at 2012-03-03 21:14:50 -0600

ActionController::RoutingError (No route matches "/public/stylesheets/bootstrap-responsive.css"):


Rendered c:/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/actionpack-3.0.10/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.0ms)


Started GET "/public/stylesheets/elements.less" for 127.0.0.1 at 2012-03-03 21:14:51 -0600

ActionController::RoutingError (No route matches "/public/stylesheets/elements.less"):


Rendered c:/RailsInstaller/Ruby1.9.2/lib/ruby/gems/1.9.1/gems/actionpack-3.0.10/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (3.0ms)

感谢您一看

3 个答案:

答案 0 :(得分:1)

我设法找到了自己的答案......

当Less css文件需要类型为“stylesheet / less”的关系时,Rails助手 stylesheet_link_tag 正在生成“stylesheet”类型的关系属性。

修复程序指定了这样的关系:

 <%= stylesheet_link_tag 'elements.less', :rel => 'stylesheet/less' %>
 <%= stylesheet_link_tag 'main.less', :rel => 'stylesheet/less' %>

答案 1 :(得分:0)

尝试更改资源的路径,例如:

# config/routes.rb

resources :public, :path => :my_public

这将为您提供路线

public_index GET  /my_public(.:format)          public#index
             POST /my_public(.:format)          public#create
new_public   GET  /my_public/new(.:format)      public#new
edit_public  GET  /my_public/:id/edit(.:format) public#edit
public       GET  /my_public/:id(.:format)      public#show
             PUT  /my_public/:id(.:format)      public#update
             DELETE /my_public/:id(.:format)    public#destroy

这样就不会弄乱对public目录中静态资产的请求。但您可能希望重命名资源和控制器。

答案 2 :(得分:0)

如果您使用的是bootstrap-saas gem,请确保从application.html.erb文件中取出“link href ='assets / css / bootstrap-responsive.css'rel ='stylesheet'”标记,这将阻止助手生成导致路由错误的关系。