1

3 番目のモデルを介して接続されている 2 つのモデルがあります。

Playlist has_many :song_in_playlists, :dependent => :destroy
         has_many :songs, :through => :song_in_playlists

Song has_many :song_in_playlists, :dependent => :destroy
     has_many :playlists, :through => :song_in_playlists

このsong_in_playlist表には、playlist_idsong_id、およびtrack_number.

を呼び出すとき/playlists/1.jsonに、プレイリストの属性を保持し、曲を含む別のハッシュを内部に持つ json ハッシュを取得したいと思います (/songs.jsonプラステーブル エントリtrack_numberからのように)。song_in_playlists

Rails APIによると、次のようにしてこれを達成できるはずです。

  def show
    @playlist = Playlist.find(params[:id])
    [...]
      respond_to do |format|
        format.html # show.html.erb
        format.json { render json: @playlist.as_json(
                           :include => { :song_in_playlists => { 
                              :only => :track_number, :include => :songs { 
                                 :except => [:dropbox_link, :local_path] } } } 
                            ) }
      end
    end
  end

ただし、私が得るものは次のとおりです。

/home/sloth/audiomixer/app/controllers/playlists_controller.rb:30: syntax error, unexpected '{', expecting '}'
            :only => :track_number, :include => :songs { 
                                                        ^
/home/sloth/audiomixer/app/controllers/playlists_controller.rb:31: syntax error, unexpected '}', expecting keyword_end
              :except => [:dropbox_link, :local_path] } } } 
                                                         ^
/home/sloth/audiomixer/app/controllers/playlists_controller.rb:103: syntax error, unexpected $end, expecting keyword_end

だから私は少し複雑さを減らしてみました。

format.json { render json: @playlist.as_json( 
                                :include => song_in_playlists { 
                                   :only => :track_number } ) }

しかし、私は同様のエラーが発生しています。かっこの間に中かっこを入れるとすぐに、Rails は文句を言いますが、API ドキュメントには反対のことが書かれています。

私はもう何を試すべきか本当にわかりません:(

PS: ルビー 1.9.3、レール 3.2.13

---編集--- わかりました、理由はよくわかりませんが、期待される出力を生成するためにこれを得ました:

format.json { render json: @playlist.as_json( 
                    :include => { :song_in_playlists => { 
                       :include => :song, :only => :track_number } } ) }

{ :except => [:dropbox_link, :local_path] }ただし、 との間に追加しようとする:song, :only、同じエラーが再び発生します..

4

1 に答える 1

3

これはレールに関する部分的なものです

:include => song_in_playlists {:only => :track_number}

有効なRuby構文ではありません

これはあるべきです

:include => {:song_in_playlists => {:only => :track_number}}

毎回、キーは関連付け名 (song_in_playlists) で、値は 1 つ以上のキーを含むハッシュ:only:exceptまたは:include

json にある曲テーブルの属性を変更する場合は、次のようにする必要があります。

format.json { render json: @playlist.as_json( 
                :include => { :song_in_playlists => { 
                   :include => :song, :only => :track_number } } ) }

:songたとえば、曲で何をしたいのかを説明するハッシュに置き換えます

format.json { render json: @playlist.as_json( 
                :include => { 
                  :song_in_playlists => { 
                    :include => {
                      :song => {
                        :except => [:dropbox_link, :local_path]
                      }
                    }, 
                    :only => :track_number 
                  } 
                 })}
于 2013-06-28T14:33:25.383 に答える