【问题标题】:Why is my rails application not responding properly to the .js format in production environement?为什么我的 Rails 应用程序无法正确响应生产环境中的 .js 格式?
【发布时间】:2012-07-16 23:15:15
【问题描述】:

我有一个非常简单的 Rails 应用程序,它的某些功能是基于 ajax 的。 当我在开发环境中使用它时,一切都按预期运行。 然而,在生产环境中发生了一些奇怪的事情:当进行 ajax 调用时,呈现的是 HTML(基于 HAML)布局而不是 js(基于咖啡)。

在比较生产和开发的日志时,很明显我在处理响应的方式上做错了,但我一直在摸不着头脑好几个小时了。

假设我的请求是:/software_tags/1/edit.js 在我的开发日志中,我可以看到(输出是正确的,我得到了预期的 javascript 页面):

Started GET "/software_tags/1/edit.js" for 127.0.0.1 at 2012-07-17 16:59:34 -0700
Processing by SoftwareTagsController#edit as JS
  Parameters: {"id"=>"1"}
  Rendered shared/_error_messages.haml (0.1ms)
  Rendered software_tags/_form.haml (4.5ms)
  Rendered software_tags/edit.js.coffee (5.7ms) <---- THIS IS GOOD!
Completed 200 OK in 10ms (Views: 8.1ms | ActiveRecord: 0.4ms)

然而,在我的开发日志中,我看到了(输出错误,我得到了 HTML 页面):

Started GET "/software_tags/1/edit.js" for x.x.x.x at 2012-07-18 01:59:54 +0200
Processing by SoftwareTagsController#edit as JS <--- Wouldn't that force the edit.js.coffee to be rendered instead of the edit.haml?
  Parameters: {"id"=>"1"}
  Rendered shared/_error_messages.haml (0.1ms)
  Rendered software_tags/_form.haml (2.8ms)
  Rendered software_tags/edit.haml (3.2ms)      <---- THIS IS WRONG!
Completed 200 OK in 5ms (Views: 3.5ms | ActiveRecord: 0.5ms)

在我的控制器中,编辑操作如下所示:

  def edit
    respond_to do |format|
      format.js
      format.html
      format.json { render json: @software_tag }
    end
  end

但是,当我尝试访问 json 数据时,所有环境中的一切都很好,那么 js 输出的错误输出可能是什么问题?

编辑:也许我错过了一些相当简单的东西。我仍然无法从我的生产环境中实现开发中的工作。我正在使用 ruby​​ 1.9.3 和 Rails 3.2.6,以及 jQuery / jQuery-ujs。基本上,我会改进我的问题:当使 link_to remote: true 时,我怎样才能强制服务器用一个 javascript 文件回答我(并在 respond_to.js 块而不是 html 块上分支)?

【问题讨论】:

  • 通过 AJAX 发出请求这一事实不会改变请求所期望的格式。 XHR 请求仍然可以针对 HTML、XML、JSON、GIF 或 PDF 资源。
  • 我一直在搞各种事情,我真的不明白为什么从开发到生产的行为不同(唯一的区别是我在前者上使用乘客)。我尝试使用 ajaxSetup 函数在 jQuery 中更改 XHR 的接受设置,仍然是同样的问题。任何帮助将不胜感激。

标签: javascript ruby-on-rails jquery render


【解决方案1】:

如果是 :assets 组内的 gem,则此 gem 仅用于资产目录(在应用程序、供应商、lib 中),而不是在视图中。

有三种方法可以正常工作:

  1. 将咖啡栏移到资产之外
  2. 在 appllication.rb 中取消注释:# Bundler.require(:default, :assets, Rails.env)
  3. 使用 gem coffee-views https://github.com/yury/coffee-views

【讨论】:

  • 谢谢拉多。如果您能告诉我为什么这种行为从开发到生产不同,我很乐意接受您的回答。
  • 因为在 application.rb 你有这个: Bundler.require(*Rails.groups(:assets => %w(development test))) 这个负载组 :assets 在开发中,在生产中被称为仅在预编译过程中。
  • 请注意,在生产环境中使用coffeescript 模板性能非常差,因为coffeescript 在每次请求时都会编译模板。考虑改用 js.erb。
【解决方案2】:

我终于找到了我的问题的答案。对我来说这听起来像是一个错误,或者我可能遗漏了一些东西。

我已将调试消息放在我的控制器上,如下所示:

def edit
  respond_to do |format|
    format.js { Rails.logger.info "in JS handler" }
    format.html { Rails.logger.info "in HTML handler" }
    format.json { render json: @software_tag }
  end
end

事实上,调用了正确的操作,但文件 edit.haml 被渲染而不是 edit.js.coffe,即使在 format.js 块中也是如此。

我找到的解决方案是将 gem 'coffee-rails' 从我的 gemfile 移到 :assets 组之外,如下所示: 之前:

group :assets do
  gem 'uglifier'
  gem 'sass-rails'
  gem 'coffee-rails'
end

之后:

gem 'coffee-rails'
group :assets do
  gem 'uglifier'
  gem 'sass-rails'
end

现在,在生产环境中一切正常。

感谢你们的帮助!

【讨论】:

    【解决方案3】:

    你试过了吗:

    respond_to :js, :only => :edit
    

    在控制器的顶部?

    或者在 format.js 块中指定模板渲染,就像使用 json 块一样。

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 1970-01-01
      • 2021-01-26
      • 2010-12-29
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多