【问题标题】:Rails applying wrong "layouts" in production, though fine in deploymentRails 在生产中应用错误的“布局”,但在部署中很好
【发布时间】:2011-09-03 05:48:33
【问题描述】:

我的 Rails 应用中有三种布局。我发现它们在我的开发机器上都完全按照预期工作,但是当我部署到生产环境时,视图以错误的布局呈现。

例如,我有这个……

class AgendasController < ApplicationController

  layout('main')

  def show
    @agenda = Agenda.find(params[:id])
    render( :action => :show, :layout => 'agenda')
  end

  # etc ...

end

我希望所有视图都以“主”布局呈现,但 show 以“议程”布局呈现。

正如我所说,它在开发中运行良好,但在生产中,show 视图以“主”布局而不是预期的“议程”布局呈现。

我也尝试过添加...

layout('main', :except => :show)

但这无济于事——同样的结果。

我正在使用 Rails 2.3.11 和乘客

我在生产中的 gem 环境以防万一...

RubyGems Environment:
  - RUBYGEMS VERSION: 1.3.5
  - RUBY VERSION: 1.8.7 (2009-12-24 patchlevel 248) [i686-linux]
  - INSTALLATION DIRECTORY: /opt/ruby-enterprise-1.8.7-2010.01/lib/ruby/gems/1.8
  - RUBY EXECUTABLE: /opt/ruby-enterprise-1.8.7-2010.01/bin/ruby
  - EXECUTABLE DIRECTORY: /opt/ruby-enterprise-1.8.7-2010.01/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86-linux
  - GEM PATHS:
     - /opt/ruby-enterprise-1.8.7-2010.01/lib/ruby/gems/1.8
     - /home/emicha/.gem/ruby/1.8
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :benchmark => false
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - http://gems.rubyforge.org/

我以前从未见过这个问题,服务器上的所有其他应用程序都运行良好。


更新

生产日志声称它使用的是“议程”布局,但浏览器中显示的是“主要”布局。我可以通过外观和查看 HTML 源代码来判断——其中包含的 JS 文件不在“议程”布局中。

Processing AgendasController#show (for 10.1.1.136 at 2011-09-02 13:22:00) [GET]
  Parameters: {"action"=>"show", "id"=>"1682", "controller"=>"agendas"}
Rendering template within layouts/agenda
Rendering agendas/show

【问题讨论】:

  • 您能否发布生产日志以显示它决定使用哪种布局?
  • 是的,我认为这在某种程度上与缓存有关。

标签: ruby-on-rails ruby


【解决方案1】:

解决方案

好的,这就是发生的事情。在“主要”布局中,我有类似...

= stylesheet_link_tag "styles", 'other_styles', :cache => true

= javascript_include_tag 'jquery-1.6.2.min', 'application', :cache => true

在“议程”布局中,我刚刚...

= stylesheet_link_tag "agenda" :cache => true

在开发环境中,Rails 不会缓存这些资产(即将它们连接在一起),所以一切正常。但在生产中,当你有 :cache =&gt; true 时它会这样做。

它还包含了带有议程布局的连接 JS 文件(即使该布局不使用任何 JS 并且它没有链接到 head 元素中)。

JS“.all”文件的意外样式和存在让我相信它为议程显示视图使用了错误的布局。

事实证明,Rails 一直使用正确的布局,但显然包括所有连接的资产文件。

解决方案是将“议程”布局更改为具有此...

= stylesheet_link_tag "agenda" :cache => false

【讨论】:

  • 我认为你可以这样做::cache =&gt; 'agenda' 并且该布局会有不同的缓存文件
【解决方案2】:

** 编辑 **

最初我认为这可能是一个多元化问题,但事实并非如此。

我不建议将其作为最终解决方案,但我很好奇它是否会改变您的结果。你可以试试这个看看你是否得到了正确的布局?

class AgendasController < ApplicationController
  layout :try_this_layout

  def try_this_layout
     params[:action] == 'show' ? 'agenda' : 'main'
  end
end

【讨论】:

  • 谢谢。结果似乎没有改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多