尝试呈现 js.erb 部分模板时出现问题
Issue when trying to render a js.erb partial template
Rails 版本 6.0.2.1
Ruby 版本 2.6.5
我正在尝试使用 jquery 在我的应用程序的显示视图中呈现部分内容。
这是我的 javascript 文件:
import $ from "jquery";
$(() =>
$("a#test-button").on("click", ev => {
ev.preventDefault;
$("div#teacher-form").html("<%= j render(partial: 'teacher_form') %>");
})
);
然后我在视图模板中引用了 javascript,如下所示:
<%= javascript_pack_tag 'test_button' %>
<%= link_to 'Test', stakeholder_student_school_year_path, data: { type: :html }, remote: true, id: 'test-button', class: 'btn btn-info' %>
<div id="teacher-form"></div>
在我的控制器中也是如此:
def show
@teachers = @year.teachers
respond_to do |format|
format.html
format.js {
render 'student_school_years/_teacher_form',
layout: false
}
end
end
当我单击测试按钮添加部分时,它会在视图中呈现以下代码片段 <%= j render(partial: 'teacher_form') %> 而不是实际的部分模板。无法弄清楚发生了什么。
您似乎完全误解了 JS.erb 模板的工作原理。
您没有使用 javascript_pack_tag
引用 .js.erb
模板。那是为了引用资产管道中的资产。而且您不能在资产管道中呈现部分,因为它们是在部署时编译的。
你只是得到一个文字字符串的原因 "<%= j render(partial: 'teacher_form') %>"
是因为资产不是通过 webpack 中的 ERB 发送的。 Sprockets 会这样做并引发错误。
相反,您可以编写 js.erb
模板来改变页面:
def show
@teachers = @year.teachers
respond_to do |format|
format.html
format.js # renders show.js.erb
end
end
// You can't use imports since this is not run in the assets pipeline
// you have to make jQuery a global
$("#teacher-form").html("<%= j render(partial: 'teacher_form' %>");
当您单击 link 时,Rails ujs 驱动程序实际上只是加载该脚本并在页面上对其进行评估。前提是这可以让你在没有 SPA 框架或实际编写请求处理程序的情况下执行 ajax 请求和类似 SPA 的东西。这个想法好不好还有待商榷。
我不明白的是,为什么您不首先将表单放在视图中,只是切换它的可见性而不是让服务器同谋,这只是客户端转换。
Rails 版本 6.0.2.1 Ruby 版本 2.6.5
我正在尝试使用 jquery 在我的应用程序的显示视图中呈现部分内容。
这是我的 javascript 文件:
import $ from "jquery";
$(() =>
$("a#test-button").on("click", ev => {
ev.preventDefault;
$("div#teacher-form").html("<%= j render(partial: 'teacher_form') %>");
})
);
然后我在视图模板中引用了 javascript,如下所示:
<%= javascript_pack_tag 'test_button' %>
<%= link_to 'Test', stakeholder_student_school_year_path, data: { type: :html }, remote: true, id: 'test-button', class: 'btn btn-info' %>
<div id="teacher-form"></div>
在我的控制器中也是如此:
def show
@teachers = @year.teachers
respond_to do |format|
format.html
format.js {
render 'student_school_years/_teacher_form',
layout: false
}
end
end
当我单击测试按钮添加部分时,它会在视图中呈现以下代码片段 <%= j render(partial: 'teacher_form') %> 而不是实际的部分模板。无法弄清楚发生了什么。
您似乎完全误解了 JS.erb 模板的工作原理。
您没有使用 javascript_pack_tag
引用 .js.erb
模板。那是为了引用资产管道中的资产。而且您不能在资产管道中呈现部分,因为它们是在部署时编译的。
你只是得到一个文字字符串的原因 "<%= j render(partial: 'teacher_form') %>"
是因为资产不是通过 webpack 中的 ERB 发送的。 Sprockets 会这样做并引发错误。
相反,您可以编写 js.erb
模板来改变页面:
def show
@teachers = @year.teachers
respond_to do |format|
format.html
format.js # renders show.js.erb
end
end
// You can't use imports since this is not run in the assets pipeline
// you have to make jQuery a global
$("#teacher-form").html("<%= j render(partial: 'teacher_form' %>");
当您单击 link 时,Rails ujs 驱动程序实际上只是加载该脚本并在页面上对其进行评估。前提是这可以让你在没有 SPA 框架或实际编写请求处理程序的情况下执行 ajax 请求和类似 SPA 的东西。这个想法好不好还有待商榷。
我不明白的是,为什么您不首先将表单放在视图中,只是切换它的可见性而不是让服务器同谋,这只是客户端转换。