Rails3 使用 text/html 内容类型而不是 text/javascript 呈现 js.erb 模板
Posted
技术标签:
【中文标题】Rails3 使用 text/html 内容类型而不是 text/javascript 呈现 js.erb 模板【英文标题】:Rails3 renders a js.erb template with a text/html content-type instead of text/javascript 【发布时间】:2011-02-13 20:47:29 【问题描述】:我正在使用 3.0.0.beta3 构建一个新应用。我只是尝试将 js.erb 模板呈现给 Ajax 请求以执行以下操作(在 Publications_controller.rb 中):
def get_pubmed_data
entry = Bio::PubMed.query(params[:pmid])# searches PubMed and get entry
@publication = Bio::MEDLINE.new(entry) # creates Bio::MEDLINE object from entry text
flash[:warning] = "No publication found."if @publication.title.blank? and @publication.authors.blank? and @publication.journal.blank?
respond_to do |format|
format.js
end
end
目前,我的 get_pubmed_data.js.erb 模板很简单
alert('<%= @publication.title %>')
服务器响应如下
alert('Evidence for a herpes simplex virus-specific factor controlling the transcription of deoxypyrimidine kinase.')
除了浏览器中没有发生任何事情之外,这非常好,可能是因为响应的内容类型是“text/html”而不是“text/javascript”,如此处部分复制的响应标头所示:
Status 200
Keep-Alive timeout=5, max=100
Connection Keep-Alive
Transfer-Encoding chunked
Content-Type text/html; charset=utf-8
这是一个错误还是我错过了什么?感谢您的帮助!
【问题讨论】:
你怎么称呼get_pubmed_data
?在 Rails 3 中你必须这样做:<%= link_to 'Click here', :controller => :publications, :action => :get_pubmed_data, :remote => true %>
对 get_pubmed_data 的调用很好,通过 javascript observe_field 函数完成,带有正确的 -Requested-With XMLHttpRequest
request Headers
【参考方案1】:
我终于能够通过以下方式强制在响应中获得正确的内容类型:
respond_to do |format|
format.js render :content_type => 'text/javascript'
end
【讨论】:
【参考方案2】:在 Rails 3.1.1 中,我遇到了类似的问题。即使我在控制器中明确提到了 format.js,我的响应也会呈现为 html。事实证明,问题在于我的资产中有 jquery.js 文件并被模板加载。 jquery-rails 使用它自己的 jquery 副本,并且还加载了这些文件导致 rails 出于某种原因将响应呈现为 html。可能会帮助其他人解决这个问题。
【讨论】:
你是怎么解决这个问题的?我遇到了同样的问题,无论我按什么顺序加载它,都有问题。【参考方案3】:有一个类似的问题,即 js 文件将作为文本文件加载,但最后只是我的脚本以错误的顺序加载。
替换
<%= javascript_include_tag :all %>
与
<%= javascript_include_tag "jquery.min" %>
<%= javascript_include_tag "jquery-ui.min" %>
<%= javascript_include_tag "rails" %>
还要注意,getscript 方法
即替换:
onClick="<%= get_pubmed_data_path(:format => :js) %>"
与:
onClick="$.getScript('<%= escape_javascript(get_pubmed_data_path(:format => :js)) %>');"
【讨论】:
太好了,我明天先试试…… 好吧,它没有用。仍然让我的 js.erb 模板嵌入到布局中。 我唯一能看到的是您可能想要升级 rails(假设您仍在使用 beta3)。使用 Rails 3.0.0 它对我有用。祝你好运!【参考方案4】:我遇到了同样的问题,结果发现我在控制器上创建了一个名为 content_type 的方法,该方法覆盖了默认值。
【讨论】:
以上是关于Rails3 使用 text/html 内容类型而不是 text/javascript 呈现 js.erb 模板的主要内容,如果未能解决你的问题,请参考以下文章
表单提交返回内容类型为 application/json 而不是 text/html 的响应
为啥 Jetty 使用 text/html 内容类型提供 css
为啥 Jetty 使用 text/html 内容类型提供 css
使用 flask-restful 时返回 text/html 内容类型