目前使用以下railscast http://railscasts.com/episodes/196-nested-model-form-revised
处理嵌套表单我有一个机会模型,
class Opportunity < ActiveRecord::Base
has_many :headings
accepts_nested_attributes_for :headings
end
标题模型
class Heading < ActiveRecord::Base
belongs_to :opportunity
has_many :subheadings
accepts_nested_attributes_for :subheadings
end
和一个副标题模型
class Subheading < ActiveRecord::Base
belongs_to :heading
end
现在我正在研究机会模型新行动的观点。
<h1>Add an opportunity</h1>
<%= form_for(@opportunity, :html => {:role => 'form'}) do |f| %>
<%= f.fields_for :headings do |builder| %>
<%= render 'heading_fields', f: builder %>
<% end %>
<%= link_to_add_fields "Add heading", f, :headings %>
<%= f.submit %>
<% end %>
_heading_fields.html.erb partial:
<fieldset>
<%= f.label :title, "Heading" %>
<%= f.text_field :title %>
<%= f.hidden_field :_destroy %>
<%= link_to "Remove section", '#', class: "remove_fields" %>
<%= link_to_add_fields "Add section", f, :subheadings %>
</fieldset>
最后是应用程序助手中的link_to_add_fields方法:
def link_to_add_fields(name, f, association)
new_object = f.object.send(association).klass.new
id = new_object.object_id
fields = f.fields_for(association, new_object, child_index: id) do |builder|
render(association.to_s.singularize + "_fields", f: builder)
end
link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")})
end
现在我在link_to_add_fields函数中收到以下渲染调用错误:
syntax error, unexpected tIDENTIFIER, expecting keyword_end
它似乎与link_to_add_fields方法中呈现的部分名称中的下划线有关,因为当下划线不存在时它会消失。
非常感谢解决这个问题的任何帮助!
答案 0 :(得分:1)
<强>调试强>
正如评论中所提到的,你基本上会遇到关闭循环的问题--Rails期待end
调用,但你已经设置了一个标识符来代替。
看了你的代码,我看不出问题出在哪里,所以我会给你一些关于我如何调试它的细节:
我会删除任何我认为会导致的元素 问题,直到我开始工作
例如,我首先用一段演示内容替换def link_to_add_fields(name, f, association)
:
def link_to_add_fields(name, f, association)
"test"
end
如果这输出正确的字符串,则表示错误在此方法内(我无论如何都在猜测)。如果是这种情况,我会尝试这个:
def link_to_add_fields(name, f, association)
new_object = f.object.send(association).klass.new
id = new_object.object_id
fields = "test"
link_to(name, '#', class: "add_fields", data: {id: id, fields: fields})
end
如果此方法有效,则表示问题可能与您正在使用的f.fields_for
循环有关。虽然这只是我的猜测,但它基本上就是我调试的方式 - 按顺序删除它直到实际工作
<强>字段强>
如果您希望动态地向表单添加字段,您可能希望使用cocoon
gem。您使用的Railscast首先有点过时,只允许您在表单中添加单个字段
“正确”的方法是使用ajax方法,I detail here
我找到了一个非常好的网站,它向您展示了如何做到这一点,但是the site已经离线了。无论如何,我会在这里为你解释一下:
#config/routes.rb
resources :controller do
collection do
get :add_field
end
end
这为您提供了将ajax请求发送到:
的路由<强>控制器强>
#app/views/controller/form.html.erb
<%= form_for @model do |f| %>
<%= render partial: "fields", locals: { builder: f } %>
<%= link_to "Add Field", controller_add_field_path, id: "add_field", remote: true %>
<%= f.submit "test" %>
<% end %>
#app/views/controllers/your_controller.rb
Class YourController < ActiveRecord::Base
def add_field
@model = Model.new
@model.association.build
render "add_field", layout: false
end
end
<强>视图强>
现在您需要使用add_field
部分
fields_for
视图
#app/views/controller/_form.html.erb
<%= form_for @model do |f| %>
<%= render partial: "fields", locals: { builder: f } %>
<% end %>
#app/views/controller/_fields.html.erb
<%= f.fields_for :association, child_index: Time.now.to_i do |a| %>
<%= a.text_feld :your_fields %>
<% end %>
<强> JQuery的强>
您需要做的就是创建一种获取新字段的方法:
#app/assets/javascripts/application.js.coffee
$ ->
$(document).on "ajax:success", "#add_field", (data) ->
el_to_add = $(data).html()
$('#new_form').append(el_to_add)
答案 1 :(得分:0)
我能够使用https://github.com/nathanvda/cocoon获得动态表单字段 出于某种原因,rBates视频已过时用于rails 4. +,Cocoon能够修复,因为我花了调试但是在Vain中。 谢谢Rick Peck。