如何在歌曲模型中创建类似“添加更多字段”的链接?我能够用我的事件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
答案 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可以更轻松地处理嵌套表单。