我正在嘗試爲音樂家創建一個列表應用程序。用戶可以上傳他們的歌曲曲目&從這些歌曲列表中挑選歌曲以填充特定演出的集合列表。Rails:我如何在一個視圖中將項目增量添加到排序列表中
查看圖片:setlist_screenshot。 單擊左側上的歌曲上的箭頭圖標應將該歌曲添加到右側上的可排序列表中。
模式有問題:
class Setlist < ActiveRecord::Base
belongs_to :organization
# join between Set Lists & Arrangements(songs)
has_many :items, -> { order(position: :asc) }
has_many :arrangements, through: :items
end
-
class Item < ActiveRecord::Base
# join between Set Lists & Arrangements(songs)
belongs_to :arrangement
belongs_to :setlist
acts_as_list scope: :setlist
end
-
class Arrangement < ActiveRecord::Base
belongs_to :song
belongs_to :organization
has_many :attachments
# join between Set Lists & Arrangements(songs)
has_many :items
has_many :setlists, through: :items
end
基本上是一個演出曲目有很多的安排(這首歌)直通項目(連接表),並安排(歌曲)當然可以在許多曲目列表中。
我有用於按鈕添加歌曲的視圖中的代碼是:
<%= link_to(organization_setlists_path(:arrangement_id => song.arrangements.first.id, setlist_id: @new_set.id, remote: true), method: "post", class: "secondary-content")
其是交請求(包括對PARAMS歌曲的安排ID & ID的Setlist.new在製成新動作)到的setlists控制器的創建操作,如下:
class SetlistsController < ApplicationController
before_action :authenticate_user!
def new
if @new_set.nil?
@new_set = Setlist.create
@new_item = Item.new
end
end
def create
@arrangement = Arrangement.find(params[:arrangement_id])
@new_item = Item.new
@new_item.setlist_id = Setlist.find(params[:setlist_id])
@new_item.arrangement_id = @arrangement.id
if @new_item.save
flash[:message] = "Song Sucessfully Added!"
else
flash[:message] = "Something Went Wrong"
end
end
理想情況下,我想添加/箭頭按鈕的每次點擊後要創建(遠程)對於相同的setlist一個新項,直到用戶完成創建該集合列表。要顯示在右邊,我有:
<% if @new_set && @new_set.items.count >=1 %>
<ul>
<% @new_set.items.each do |item| %>
<li class="center-align"><%= item.arrangement.title %></li>
<% end %>
</ul>
<% else %>
<p class="center-align">Add Songs From The List On The Left</p>
<% end %>
最終,用戶應該能夠完成它,並繼續創建另一組名單,如果他們想。
我真的不知道如何去做這件事,而不是我在這裏所做的,這是行不通的。問題是:
其中之一,創建操作實際上是創建一個項目&分配新項目的外鍵安排,但不是爲了某種原因的設定列表,即使是集合ID正在從link_to params。另外,每次刷新頁面時,都會根據我在新動作中生成的新生成列表生成新的生成列表,因此每添加一個項目都會進入一個生成列表,然後生成一個空白生成列表,因此不會有任何結果出現在右側。
最後,這似乎只是混亂在一起。任何人都有更好的設計策略來實現這一目標?任何幫助將受到嚴厲的讚賞!
你可能想搜索Github的幾個不同的'Todo'應用程序,並研究他們如何解決這個問題。這是非常相似的情況。 – max
非常感謝!在我發佈這篇文章之後,不久之後,我就指出了濫調setlists控制器的問題,並且您的回答充實了更多需要做的事情。我想我習慣於在新動作中創建和「建立」對象並將它們保存在創建中,而這種情況要求我在編輯動作中執行實際的「構建」,以params中的setlist id添加依賴對象時的引用。如果我的理解正確,在第二種解決方案中,表單將處於編輯視圖中,對嗎?這種形式會產生一個下拉框? –
如果是這樣,我將如何使用該解決方案(使用表單),只需點擊一下按鈕,而不是下拉菜單? –