0
我在Ruby on Rails中創建一個應用程序,用戶可以在其中聽兩種不同類型的歌曲。我想跟蹤用戶收聽的每首歌曲(和類型)。用戶可以收聽user_song或master_song。 我的第一個想法是使用多態關聯。RoR:多態協會:ID和類型爲零
首先,我的用戶模型是這樣的:
class User < ActiveRecord::Base
has_many :song_listens, :foreign_key => "user_id"
,然後。我宣佈多態性是這樣的:
class SongListen < ActiveRecord::Base
belongs_to :listenable, :polymorphic => true
belongs_to :user
class UserSong < ActiveRecord::Base
has_many :song_listens, :as => :listenable, :class_name => "SongListen"
class MasterSong < ActiveRecord::Base
has_many :song_listens, :as => :listenable, :class_name => "SongListen"
我SongListens遷移:
class CreateSongListens < ActiveRecord::Migration
def change
create_table :song_listens do |t|
t.integer :user_id
t.references :listenable, :polymorphic => true
t.timestamps
end
end
end
的問題出現時,我嘗試保存用戶的歌在多態表聽。我的類型和ID爲零。參見 - >:
[["created_at", Mon, 07 May 2012 18:25:34 UTC +00:00], ["listenable_id", nil],["listenable_type", nil], ["updated_at", Mon, 07 May 2012 18:25:34 UTC +00:00], ["user_id", 1]]
正如您所看到的,正在設置user_id。
我SongListensController:
def create
@song_listen = current_user.song_listens.build(params[:listenable_id => :user_song_id])
@song_listen.save
end
def create_ms_listen
@song_listen = current_user.song_listens.build(params[:listenable_id => :master_song_id])
@song_listen.save
end
我的觀點:
<% @user_songs.each do |user_song| %>
<td><%= link_to 'Play Song', user_song.song.url, class: :play, remote: :true %></td>
<% end %>
<% @master_songs.each do |master_song| %>
<td><%= link_to 'Play Song', master_song.m_song.url, class: :play, remote: :true %></td>
<% end %>
我認爲這說明了我的大部分問題,但爲了好玩,我使用Ajax創建歌曲通過聽音樂通過路由發送數據到SongListen的播放器創建動作:
$('a.play').click(function(e) {
e.preventDefault();
$("#jquery_jplayer_1")
.jPlayer("setMedia", {mp3: this.href })
.jPlayer("play");
$.ajax({
url: '/create_ms_listen.json',
data: { "master_song_id" : "master_song.id"},
async: false
});
$.ajax({
url: '/create_us_listen.json',
data: { "user_song_id" : "user_song.id"},
async: false
});
.....
哪一個去我的路線:
match "create_us_listen.json" => "song_listens#create"
match "create_ms_listen.json" => "song_listens#create_ms_listen"
我知道我的目標是莫名其妙定置了可聽類型和ID在SongListen表,但到目前爲止,他們均出現了零。我究竟做錯了什麼?
嗨。 @robin我現在設置了listenable_id,但是它的編號是0 :(我編輯添加了我的視圖動作和路由到問題 – Jches
好吧,所以它會是'params [:master_song_id]''而不是'params [:song_id ]'。但是在你的javascript中,你實際上並沒有發送id:'data:{「master_song_id」:「master_song.id」}'「master_song.id」只是一個字符串,它不會工作 – Robin
感謝您的幫助。我也嘗試過讓它成爲「<%= master_song.id%>」,但它不起作用。因爲song_listen依賴於通過音樂播放器播放的歌曲,所以我想我必須通過jquery歌曲播放點擊功能將ID傳遞給控制器,你會建議採用另一種方式來做到這一點,或者我會死去嗎? – Jches