Синтаксическая ошибка в as_json при использовании многоуровневого:include

У меня есть две модели, которые связаны через третью:

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 запись в таблице).

Согласно 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

--- РЕДАКТИРОВАТЬ --- Хорошо, я действительно не знаю почему, но я получил это, чтобы произвести ожидаемый результат:

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

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

1 ответ

Решение

Это только частично о рельсах

: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 
                  } 
                 })}
Другие вопросы по тегам