嵌套属性Rails

时间:2016-12-28 21:26:56

标签: ruby-on-rails

如何在歌曲模型中创建类似“添加更多字段”的链接?我能够用我的事件has_many歌曲关系的嵌套属性来做。我是否需要为歌曲做同样的事情?

这是一个处理新歌创作的歌曲页面,同时选择将歌曲添加到哪个事件:

<br>
<br>
<div class ="container">
  <div class="jumbotron">
    <h2> Select an event to add songs to: </h2>
    <%= form_for @song do |f| %>


      <%= f.collection_select(:event_id, Event.all, :id, :name) %>

      <h3> Enter your song </h3>
      <%= f.text_field :artist, placeholder: "Artist" %>
      <%= f.text_field :title,  placeholder: "Title" %>
      <%= f.text_field :genre,  placeholder: "Genre" %>
      <h2> Enter the partycode for that event: </h2>

      <%= form_for Event.new do |f| %>

      <%= f.text_field :partycode, :required => 'required'%>

      <%= f.submit "Submit", class: "btn btn-primary", :onclick => "window.alert('Aye');" %>
      <% end %>

      <h2><%= link_to_add_fields "Want to add more songs?", f, :songs %> </h2>
    <% end %>
  </div>
</div>

link_to_add_fields 在ApplicationHelper文件中定义:

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("songs_fields", f: builder)
    end
    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")})
  end
end

我在这个ApplicationHelper文件中说错误: enter image description here

2 个答案:

答案 0 :(得分:1)

看起来你已经陷入了事件和歌曲之间的关系。您开始定义一个表单来创建/编辑一首歌曲,提供一个用于选择一个事件的界面,并在同一表格中提供“添加歌曲”(一首歌曲)。

请注意,这反映在您对此页面的描述中:“处理新歌曲创建的歌曲页面,同时选择要添加歌曲的事件”。你最好大声朗读,然后找出你想要这个页面做什么。

至于您收到的错误:错误的结果是Song没有songs方法。在link_to_add_fields方法的范围内,f是表单助手。调用f.object会返回您传递给form_for方法的对象,在本例中由@song表示。您传递给link_to_add_fields:songs的关联不作为Song的关联存在。也就是说,您无法拨打@song.songs

答案 1 :(得分:0)

您可以尝试cocoon gem

  

Cocoon可以更轻松地处理嵌套表单。