0

У меня есть две модели, которые соединены через третий:Синтаксическая ошибка в as_json при использовании нескольких уровня: включить

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_id, song_id, а также track_number.

При вызове /playlists/1.json, я хотел бы получить JSon хэш, который содержит атрибуты в список воспроизведения и имеет другой хэш внутри, который содержит песни (как в /songs.json плюс track_number из записи song_in_playlists таблицы).

Согласно the 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: Ruby 1.9.3, Rails 3.2.13

--- EDIT --- Хорошо, я не» т действительно знаю, почему, но я получил это, чтобы получить ожидаемый результат:

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

Однако при попытке добавить { :except => [:dropbox_link, :local_path] } между :song и , :only, я снова получаю те же ошибки ..

ответ

2

Это лишь частично о Рельсы

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

просто не действует синтаксис рубин

это должно быть

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

Каждый раз, ключ имя ассоциации (song_in_playlists) и значение хеш содержит один или несколько ключей :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 
        } 
       })} 
+0

Ой, спасибо, большое спасибо. Я действительно не знаю, почему я постоянно забывал скобки вокруг ': song', хотя я сделал это правильно только несколько слов раньше для': song_in_playlists'. Классический: p – kah

Смежные вопросы