per*_*nce 1 javascript jquery ruby-on-rails
基本上我的控制器动作中有一个respond_to块:
respond_to do |format|
format.js { render :js => "$('#test').html('<div class='colorize'>Test</div>');" }
end
Run Code Online (Sandbox Code Playgroud)
我也试图将一个css类添加colorize到将通过js呈现的div块,但使用引号会破坏代码.如何使用添加的类来实现此功能?
在这里为自己保留一个巨大的头痛,除了最简单的JS之外,不要在ruby处理程序中添加任何东西.
format.js { render :js => "colorizeTest()" }
Run Code Online (Sandbox Code Playgroud)
然后在页面上或通过包含的脚本,声明一个函数:
var colorizeTest = function() {
$('#test').html('<div class="colorize">Test</div>');
};
Run Code Online (Sandbox Code Playgroud)
不要把JS放在你的Ruby中.
或者您可以使用真实的视图模板:
# controller code
@some_id = 'test'
# JS format Handler
format.js
# views/whatever.ejs.js
$('#<%= @some_id %>').html('<div class="colorize">Test</div>');
Run Code Online (Sandbox Code Playgroud)
或两者兼顾!在这个例子中,这么多的抽象是愚蠢的,但只要这个JS开始做任何甚至稍微复杂的事情,这将是最好的方法.通过生成的js响应传递更多数据,减少代码.真正复杂的js逻辑应始终静态包含在页面上.
# controller code
@some_id = 'test'
# JS format Handler
format.js
// js funciton on page
var colorizeTest = function(id) {
$('#' + id).html('<div class="colorize">Test</div>');
};
# views/whatever.ejs.js
colorizeTest(<%= @some_id %>);
Run Code Online (Sandbox Code Playgroud)
最后,我可能还认为真正的"最佳"方式只是从服务器渲染JSON,并且您已经静态地包含了JS,它通过AJAX处理获取,并基于该数据处理如何处理页面.这样你就永远不会"生成"可执行的javascript服务器端,这非常干净.
// js file somewhere
var colorizeTest = function(id) {
$('#' + id).html('<div class="colorize">Test</div>');
};
var doStuff = function() {
$.getJSON("/whatever.json", function(data) {
colorizeTest(data.id);
});
};
# rails controller
render :json => { :id => 'test' }
Run Code Online (Sandbox Code Playgroud)
看看你现在如何在你的红宝石中没有任何JS?或者你的JS中有任何红宝石吗?只需在服务器和客户端之间发送数据 那个人很好.我喜欢它.