Ruby on Rails - рендер JSON - PullRequest
       10

Ruby on Rails - рендер JSON

5 голосов
/ 07 декабря 2010

У меня есть следующий контроллер:

@moulding = Moulding.find( params[:id].split(","), :select => 'id, cost, width' )
@mount = MaterialCost.find(1).cost_per_square_mm
@glass = MaterialCost.find(2).cost_per_square_mm
@backing_board = MaterialCost.find(3).cost_per_square_mm
@vat = AppOption.find( 1, :select => 'value' )
@wastage = AppOption.find( 2, :select => 'value' )
@markup = AppOption.find( 3, :select => 'value' )

respond_to do |format|
  format.json { render :json => { :moulding => @moulding, :mount => @mount, :glass => @glass, :backing_board => @backing_board, :vat => @vat, :wastage => @wastage, :markup => @markup } }
end

Вывод JSON выглядит следующим образом:

{"moulding":[{"moulding":{"cost":"3.1","id":2,"width":45}},{"moulding":{"cost":"1.5","id":4,"width":30}},{"moulding":{"cost":"2.1","id":6,"width":50}}],"mount":"0.00000246494303242769","glass":"0.0000032426589803639","backing_board":"0.00000135110790848496","vat":{"app_option":{"value":"17.5"}},"wastage":{"app_option":{"value":"20"}},"markup":{"app_option":{"value":"3"}}}

Я бы хотел, чтобы JSON был в следующем формате:

{"mouldings":[{"2":{"cost":"3.1","width":45}},{"4":{"cost":"1.5","width":30}},{"6":{"cost":"2.1","width":50}}],"mount":"0.00000246494303242769","glass":"0.0000032426589803639","backing_board":"0.00000135110790848496","vat":{"app_option":{"value":"17.5"}},"wastage":{"app_option":{"value":"20"}},"markup":{"app_option":{"value":"3"}}}

Причина, по которой я хочу это сделать, заключается в том, чтобы я мог извлечь данные для определенного moulding на id из строки JSON.Как я могу переформатировать визуализированный JSON?

1 Ответ

3 голосов
/ 07 декабря 2010

В своем первоначальном ответе я ошибочно предположил, что @moulding был одним объектом, тогда как на самом деле это был набор объектов. Ответ сработал бы в этом случае. Чтобы сделать то, что вы хотите для молдингов, вам придется упаковать набор предметов. Это будет выглядеть так:

@moulding.collect! do |moulding|
    { moulding.id => {:cost=>moulding.cost, :width=>moulding.width}}
end

respond_to do |format|
    format.json { render :json => { :moulding => @moulding, :mount => @mount, :glass => @glass, :backing_board => @backing_board, :vat => @vat, :wastage => @wastage, :markup => @markup } }
end 

Метод collect будет перебирать все элементы в наборе форм, которые у вас есть, и помещать возвращаемое значение в новый массив для вас. Метод collect! делает это на месте (изменяет массив, с которым вы работаете). Если вы хотите присвоить его новой переменной, это нормально.

По сути, я превратил объекты формовки в наборы хэшей. Окончательный результат будет выглядеть так, как вы хотели.


старый ответ:

Похоже, что вы хотите изменить :moulding ключ в вашем коде на идентификатор элемента. Пример:

format.json { render :json => { @moulding.id => @moulding, :mount => @mount, :glass => @glass, :backing_board => @backing_board, :vat => @vat, :wastage => @wastage, :markup => @markup } }

Я не совсем уверен, как подавить удостоверение личности на макушке, но повторение удостоверения личности не должно повредить.

ПРИМЕЧАНИЕ: Имя ключа формовки использует префикс @ вместо символа, который был там ранее. Это очень тонкая и легко пропускаемая деталь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...