Ajax加载静态Rails部分

时间:2016-10-12 03:29:50

标签: javascript jquery ruby-on-rails

在我的rails应用中,我在public/templates/_hero-1.html.erb

中有一个html模板

在我的application.js.erb文件中,我试图将该模板加载到我动态创建的div中,然后再呈现整个div

// Append component to text editor when clicked
$('.js-TemplateThumbnail').click(function() {
    // Define new template container
    var newTemplateContainer = $('<div class="position-relative hideChild js-TemplateContainer">');

    // Insert selected template into new template container
    newTemplateContainer.load("<%= 'public/templates/hero-1' %>");

    // Build new template
    $('.js-Canvas .js-TemplateContainer').last().after(newTemplateContainer);
});

但我收到了控制台错误GET http://localhost:3000/public/templates/hero-1 404 (Not Found)

1 个答案:

答案 0 :(得分:1)

快速回答/相关SO答案:Rendering partial in js.erb file

更长的答案:有几种方法可以做到这一点。你可以尝试:

newTemplateContainer.load("<%= 'render partial: public/templates/hero-1' %>");

不正面会起作用。这对我来说很烦人,也让你有高度耦合的代码。如果该模板的名称发生更改,则必须在n个位置更新它。

我将解耦JS并在config/routes.rb中创建一个内部端点;例如:

get templates/:id

然后,

class TemplatesController < ApplicationController
  def show
    @template = Template.find(params[:id])
  end   
end

然后在点击处理程序的JS里面你可以:

$.get('/templates/hero-1', function(data) {
   // do stuff with returned data
   $('.js-Canvas').html(data)
});

非常简单,但更多的是尝试勾勒出一种不同的方法。这似乎也是handlebars可以帮助的东西。