我有一个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吗?
答案 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