Ajax(Asynchronous JavaScript and XML)是一种无需重新加载整个页面即可与服务器交换数据并更新部分网页的技术。在Rails中,Ajax常用于动态加载部分视图(partials),提升用户体验。
remote: true
最简单的方式是使用Rails的remote: true
选项:
<%= link_to "加载内容", load_content_path, remote: true %>
然后在控制器中响应JS格式:
def load_content
@items = Item.all
respond_to do |format|
format.js # 这会渲染load_content.js.erb
end
end
创建load_content.js.erb
:
$('#content-container').html("<%= j render partial: 'items/list', locals: { items: @items } %>");
$.ajax({
url: '/load_content',
type: 'GET',
dataType: 'script'
});
fetch('/load_content', {
headers: {
'Accept': 'text/javascript'
}
})
.then(response => response.text())
.then(text => {
eval(text);
});
原因:
解决:
routes.rb
中的路由配置respond_to :js
或format.js
块原因:
解决:
Content-Type: text/javascript
原因:
解决:
one()
代替on()
绑定一次性事件$('#container').empty().html(...)
$(window).on('scroll', function() {
if ($(window).scrollTop() > $(document).height() - $(window).height() - 50) {
if (!loading) {
loading = true;
$.getScript(nextPageUrl);
}
}
});
<%= form_for @item, remote: true do |f| %>
...
<% end %>
然后在create.js.erb
中:
<% if @item.errors.any? %>
$('#form-container').html("<%= j render 'form' %>");
<% else %>
$('#items-list').prepend("<%= j render @item %>");
$('#form-container').html("<%= j render 'form', item: Item.new %>");
<% end %>
$('#search-input').on('input', function() {
$.get('/search', { query: $(this).val() }, null, 'script');
});
j
或escape_javascript
帮助方法防止XSS通过合理使用Ajax加载Rails部分视图,可以显著提升Web应用的性能和用户体验。
没有搜到相关的沙龙