0

Ruby on Railsで2種類の曲を聴くことができるアプリを作成しています。私は、ユーザーが聞いている各曲(および種類)をトラッキングしたい。ユーザーは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のためにnilを得る。 - >:

[["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" 

私は私の目標は何とかSongListenテーブルに聴きタイプとIDを設定することです知っているが、これまでのところ、彼らは両方ともゼロとなっています。私は間違って何をしていますか?

答えて

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 [:song_id]の代わりに' params [:master_song_id] ] '。しかし、あなたのjavascriptで、あなたは実際にid:' data:{"master_song_id": "master_song.id"} '。" master_song.id "を文字列にして送信するのではなく、動作しません。 – Robin

+0

私はそれを "<%= master_song.id%>"にしようとしましたが、うまくいきませんでした。song_listenは音楽プレイヤーで再生している曲に依存していたので、jqueryの曲を再生する必要がありますあなたはこれを行う別の方法を示唆しているのでしょうか、致命的な終わりを打つのでしょうか? – Jches

関連する問題