【问题标题】:Rails display partial based on drop down selectionRails 根据下拉选择显示部分内容
【发布时间】:2016-07-21 19:49:50
【问题描述】:

所以我引用这个来设置我想要做的事情:Dynamic Partial Based on Select Box - Rails 2.3.5

基于 product_type 我想动态显示两个不同的部分之一,每个部分都包含剩余的表单字段。

应用程序.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>

当我选择下拉菜单时,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 中设置了变量,但它没有被识别。我没有正确地逃避它吗?

请指教。

【问题讨论】:

  • 你想通过{ capsule: @capsule, f: f }f: f 传递什么?
  • 你需要在你的控制器方法中设置@capsule
  • 你试过这样&lt;%= j (render partial: 'form1', locals: { capsule: @capsule }) %&gt;
  • 我对你的 config/routes.rb 很好奇。你映射 /form_partial/:id 并调用 /capsules/form_partial/... 你有一些匹配的路由 /capsules/form_partial/:id ???
  • 7urkm3n 包含这些是因为它嵌套在表单构建器中,所以我需要传递 f 以便部分表单将在那里生成标签/字段。我会按照你建议的方式试一试。

标签: jquery ruby-on-rails ruby partials


【解决方案1】:

考虑到您已在其中定义 f,这是一个奇怪的错误

<%= form_for @capsule, multipart: true do |f| %>

您确定在引用f 变量之前没有多余的end 吗?

顺便说一句,我不确定 AJAX 是解决这个问题的最佳方法。

相反,您可以将所有表单部分放在页面上并将它们全部隐藏 最初使用 CSS/JS。

然后,您可以将 Javascript 事件处理程序附加到您的表单,以便当 一个输入被选中,它对应的表单部分被打开。

顺便说一句,我发现如果你用手写而不是使用form_for,通常更容易理解表单中发生了什么。你可以看到this tutorial

【讨论】:

  • Max 我同意你的观点,昨天决定改用 jQuery。更少的开销。
猜你喜欢
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2015-03-08
  • 1970-01-01
相关资源
最近更新 更多