Синтаксическая ошибка в 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
}
})}