Rails 根据下拉选择显示部分
Rails display partial based on drop down selection
所以我参考这个来设置我想做的事情:Dynamic Partial Based on Select Box - Rails 2.3.5
基于 product_type 我想动态显示两个不同的部分之一,每个部分都包含剩余的表单字段。
application.js
$('#capsule_project_type_id').change(function() {
$.ajax({url: '/capsules/form_partial/' + this.value});
}
routes.rb
get '/form_partial/:id' => 'capsules#form_partial'
controller.rb
def form_partial
@project_type_id = ProjectType.find(params[:id])
end
form_partial.js.erb
<% if @project_type_id == 1 || @project_type_id == 2 %>
$('#form-details').html("<%= escape_javascript(render partial: 'form1', locals: { capsule: @capsule, f: f }) %>");
<% else %>
$('#form-details').html("<%= escape_javascript(render partial: 'form2', locals: { capsule: @capsule, f: f }) %>");
<% end %>
new.html.erb
创建表单:
<%= form_for @capsule, multipart: true do |f| %>
...
<div class="form-group">
<%= f.label :project_type_id, "Project type" %>
<%= f.select :project_type_id, ProjectType.all.collect{|p| [p.name, p.id]}, { :include_blank => "Please select a type..." }, { class: "form-control" } %>
</div>
<div id="form-details">
</div>
当我 select 下拉菜单 ajax 触发时,我一直在控制台中收到此错误:
ActionView::Template::Error (undefined local variable or method `f' for #<#<Class:0x007fd298ce71e8>:0x007fd2980a0268>):
1: <% if @project_type_id == 1 || @project_type_id == 2 %>
2: $('#form-details').html("<%= escape_javascript(render partial: 'weddingfields', locals: { capsule: @capsule, f: f }) %>");
3: <% else %>
4: $('#form-details').html("<%= escape_javascript(render partial: 'showerfields', locals: { capsule: @capsule, f: f } ) %>");
5: <% end %>
我在 form_partial 中设置了变量,但未被识别。我没有正确转义吗?
请指教。
考虑到您在
中定义了 f
,这是一个奇怪的错误
<%= form_for @capsule, multipart: true do |f| %>
你确定在引用 f
变量之前没有额外的 end
吗?
顺便说一句,我不确定 AJAX 是最好的方法。
相反,您可以将所有表单部分放在页面上并全部隐藏
最初是 CSS/JS.
然后您可以将 Javascript 事件处理程序附加到您的表单,这样当
选择了一个输入,它的相应表单部分被切换为打开。
顺便说一句,我发现如果您手写而不是使用 form_for
,通常更容易理解表单中发生的事情。可以看到this tutorial。
所以我参考这个来设置我想做的事情:Dynamic Partial Based on Select Box - Rails 2.3.5
基于 product_type 我想动态显示两个不同的部分之一,每个部分都包含剩余的表单字段。
application.js
$('#capsule_project_type_id').change(function() {
$.ajax({url: '/capsules/form_partial/' + this.value});
}
routes.rb
get '/form_partial/:id' => 'capsules#form_partial'
controller.rb
def form_partial
@project_type_id = ProjectType.find(params[:id])
end
form_partial.js.erb
<% if @project_type_id == 1 || @project_type_id == 2 %>
$('#form-details').html("<%= escape_javascript(render partial: 'form1', locals: { capsule: @capsule, f: f }) %>");
<% else %>
$('#form-details').html("<%= escape_javascript(render partial: 'form2', locals: { capsule: @capsule, f: f }) %>");
<% end %>
new.html.erb 创建表单:
<%= form_for @capsule, multipart: true do |f| %>
...
<div class="form-group">
<%= f.label :project_type_id, "Project type" %>
<%= f.select :project_type_id, ProjectType.all.collect{|p| [p.name, p.id]}, { :include_blank => "Please select a type..." }, { class: "form-control" } %>
</div>
<div id="form-details">
</div>
当我 select 下拉菜单 ajax 触发时,我一直在控制台中收到此错误:
ActionView::Template::Error (undefined local variable or method `f' for #<#<Class:0x007fd298ce71e8>:0x007fd2980a0268>):
1: <% if @project_type_id == 1 || @project_type_id == 2 %>
2: $('#form-details').html("<%= escape_javascript(render partial: 'weddingfields', locals: { capsule: @capsule, f: f }) %>");
3: <% else %>
4: $('#form-details').html("<%= escape_javascript(render partial: 'showerfields', locals: { capsule: @capsule, f: f } ) %>");
5: <% end %>
我在 form_partial 中设置了变量,但未被识别。我没有正确转义吗?
请指教。
考虑到您在
中定义了f
,这是一个奇怪的错误
<%= form_for @capsule, multipart: true do |f| %>
你确定在引用 f
变量之前没有额外的 end
吗?
顺便说一句,我不确定 AJAX 是最好的方法。
相反,您可以将所有表单部分放在页面上并全部隐藏 最初是 CSS/JS.
然后您可以将 Javascript 事件处理程序附加到您的表单,这样当 选择了一个输入,它的相应表单部分被切换为打开。
顺便说一句,我发现如果您手写而不是使用 form_for
,通常更容易理解表单中发生的事情。可以看到this tutorial。