使用嵌套属性动态添加rails中的字段

我正处于创建应用程序的早期阶段,我只是将一些基本代码放在适当的位置。 这是当前的代码……

应用程序/视图/卡/ front.html.erb

      

路线

  controller :cards do get '/front', action: 'front', as: 'front_of_card' post '/save', action: 'create', as: 'save_card' get '/my_contact_info', action: 'back', as: 'back_of_card' put '/save', action: 'update', as: 'save_card' get '/my_card', action: 'show', as: 'card' end 

调节器

  def create @skill= Skill.new(params[:skill]) @tag = Tag.new(params[:tag]) @tag.save @skill.tag_id = @tag.id @skill.save redirect_to front_of_card_path, notice: 'Skill was successfully created.' #get user/session #save skills & tags end 

cards.js.coffee

 jQuery -> $('form').on 'click', '.remove_fields', (event) -> $(this).prev('input[type=hidden]').val('1') $(this).closest('fieldset').hide() event.preventDefault() $('form').on 'click', '.add_fields', (event) -> time = new Date().getTime() regexp = new RegExp($(this).data('id'), 'g') $(this).before($(this).data('fields').replace(regexp, time)) event.preventDefault() 

app_helper

 module ApplicationHelper 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 end 

所以现在这段代码给了我两个文本字段。 一个用于标签名称,另一个用于标签权重,控制器在数据库中插入所有内容。 我想使用一些javascript动态添加这些标签/重量字段,因为我喜欢。 我发现的一切似乎都集中在嵌套属性上。 任何想法都赞赏。

更新

添加了更多代码以充实这一点。 我遇到的问题是我在这一行传递的第三个变量……

   

它不喜欢”技能’,但我不确定我应该在这里传递什么。

所以这就是我想出来的……这是我的两个模特……

 class Skill < ActiveRecord::Base belongs_to :tag attr_accessible :tag_id, :weight end class Tag < ActiveRecord::Base has_many :skills attr_accessible :name end 

我正在调用app / views / skills / _form.html.erb中的部分内容,并使用js标记添加新字段。 另请注意,我正在重新渲染部分,然后将其隐藏在最后一个div标记中。

  
<%= render partial: "skills_form" %>
Add New Tag
<%= f.submit %>
<% end %>
<%= render partial: "skills_form", locals: {skill: false} %>

部分非常简单。 我在这里所做的就是将值存储在数组中......

 
<%= label_tag 'tag' %> <%= text_field_tag 'tags[]' %> <%= label_tag 'weight' %> <%= text_field_tag 'weights[]' %>

...这里是javascript ...真正直截了当,只需说出点击#addNewTag时,将#new_skills_form改为#skillSet

 $(document).ready(function(){ $("#addNewTag").click(function(){ $("#skillSet").append($("#new_skills_form").html()); }); }); 

...最后控制器动作解构数组,并保存它们......

 def create @skill = Skill.new(params[:skill]) tags = params[:tags] weights = params[:weights] tags.each_with_index do |tag, index| tag = Tag.create :name => tag Skill.create :tag_id => tag.id, :weight => weights[index] end end