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表,但到目前爲止,他們均出現了零。我究竟做錯了什麼?

回答

3

這是錯誤的:

params[:listenable_id => :user_song_id] 

你可以看到爲什麼?

試一下:

def create 
    @song_listen = current_user.song_listens.build(params[:song_listen]) do |sl| 
     sl.listenable_id = params[:song_id] 
    end 
    @song_listen.save 
end 

不知道你怎麼弄的song_id,但是這是想法。


$("#jpId").bind($.jPlayer.event.play, function(event) { 
    // This event is fired when a song start playing, 
    // so do your ajax request here. 
    // Not sure how to get the id of your song. 
    // You can access your media with event.jPlayer.status.media, 
    // and from there, get the name or id of your song I guess 
}); 
+0

嗨。 @robin我現在設置了listenable_id,但是它的編號是0 :(我編輯添加了我的視圖動作和路由到問題 – Jches

+0

好吧,所以它會是'params [:master_song_id]''而不是'params [:song_id ]'。但是在你的javascript中,你實際上並沒有發送id:'data:{「master_song_id」:「master_song.id」}'「master_song.id」只是一個字符串,它不會工作 – Robin

+0

感謝您的幫助。我也嘗試過讓它成爲「<%= master_song.id%>」,但它不起作用。因爲song_listen依賴於通過音樂播放器播放的歌曲,所以我想我必須通過jquery歌曲播放點擊功能將ID傳遞給控制器​​,你會建議採用另一種方式來做到這一點,或者我會死去嗎? – Jches