Rails 4 - 强制浏览器执行javascript响应而不是显示文本

时间:2014-11-13 23:20:03

标签: javascript ruby-on-rails controller render

我有一个Rails 4应用程序,我需要强制控制器向所有请求,html或js发送js响应。出于某种原因,浏览器将响应显示为文本而不是在控制器收到html请求时执行代码(例如,当用户通过键入URL发出请求时)。

控制器:

def action
  render :template => 'sessions/home.js.erb', :content_type => "text/javascript"
end

节/ home.js.erb:

$("#button").on("click", function(){
  alert("got here");
});

浏览器只是将home.js.erb中的代码显示为文本,而不是绑定#button。

我在控制器中尝试了以下选项,但结果是相同的 - 浏览器只显示文本与执行代码:

render js: "alert('got here')";

render :format => :js, :template => 'sessions/home.js.erb'

respond_to do |format|
   format.html {render :template => 'sessions/home.js.erb', :content_type => 'text/javascript'}
end

respond_to do |format|
   format.html {render :template => 'sessions/home.js.erb', :content_type => 'application/javascript'}
end

有人可以帮我弄清楚我需要做些什么来让浏览器执行javascript吗?

2 个答案:

答案 0 :(得分:0)

Rails可以为您提供code,但是您可以确保在客户端加载和执行代码,否则它只是文本。

Jquery只为这件事提供了一些方便的助手

$.ajax({
  type: "GET",
  url: "test.js",
  dataType: "script"
});

这将加载并执行Javascript文件。或者你可以使用

$.getScript( "ajax/test.js", function( data, textStatus, jqxhr ) {
  console.log( data ); // Data returned
  console.log( textStatus ); // Success
  console.log( jqxhr.status ); // 200
  console.log( "Load was performed." );
});

这两个示例都是从Jquery api docs复制而来的。 http://api.jquery.com/jquery.ajax/http://api.jquery.com/jquery.getscript/

答案 1 :(得分:-1)

覆盖响应内容类型。在此处阅读有关响应对象的更多信息:http://guides.rubyonrails.org/action_controller_overview.html#the-response-object

试试这个:

def action
  response.content_type = Mime[:js]
  render js: "alert('got here');"
end

或适用于所有操作:

before_filter :force_js

def force_js
  response.content_type = Mime[:js]
end

或使用respond_to:

def action
  respond_to do |format|
    format.any(:html, :js) { render js: "alert('got here');" }
  end
end