Ruby on Rails - формат JSON - PullRequest
       4

Ruby on Rails - формат JSON

0 голосов
/ 08 декабря 2010

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

def calculate_quote

  @mouldings = Moulding.find( params[:id].split(","), :select => 'id, cost, width' )
  @mouldings.collect! do |moulding|
    { "moulding_id_#{moulding.id}" => { :cost => moulding.cost, :width => moulding.width } }
  end
  @material_costs = MaterialCost.all
  @material_costs.collect! do |material_cost|
    { material_cost.material.gsub(" ", "_").downcase => { :cost => material_cost.cost_per_square_mm } }
  end
  @app_options = AppOption.all
  @app_options.collect! do |app_option|
    { app_option.name.gsub(" ", "_").downcase => { :value => app_option.value } }
  end

  respond_to do |format|
    format.json { render :json => { :mouldings => @mouldings, :material_costs => @material_costs, :app_options => @app_options } }
  end
end

И это дает мне следующий вывод JSON:

{"mouldings":[{"moulding_id_2":{"cost":"3.1","width":45}},{"moulding_id_4":{"cost":"1.5","width":30}},{"moulding_id_6":{"cost":"2.1","width":50}}],"material_costs":[{"mountboard":{"cost":"0.00000246494303242769"}},{"glass":{"cost":"0.0000032426589803639"}},{"backing_board":{"cost":"0.00000135110790848496"}}],"app_options":[{"vat":{"value":"17.5"}},{"wastage":{"value":"20"}},{"markup":{"value":"3"}}]}

Я хочу отформатировать вывод JSON, чтобы я мог использовать jQuery для извлечения данных, используя следующий синтаксис:

data.mouldings.moulding_id_2.cost

Как бы я сменил контроллер для достижения этой цели?

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

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

@mouldings = Moulding.find( params[:id].split(","), :select => 'id, cost, width' )
@mouldings.collect! do |moulding|
  { :id => moulding.id, :cost => moulding.cost, :width => moulding.width }
end

Таким образом, у вас должен быть массив объектов, содержащий все данные, необходимые для этого литья.В jQuery вы можете затем выполнить итерацию по этому массиву и получить всю необходимую вам информацию, например:

$.each(data.mouldings, function(index, moulding) {
    alert("This moulding has an id of " + moulding.id + " and costs " + moulding.cost);
});

Я думаю, что это имеет гораздо больший смысл, чем явный вызов:

data.mouldings. moulding_id_2 .cost

Если вы хотите найти точный moulding_id # 2, то вам следует выполнить итерацию по вашему набору данных, как я показал выше, и выполнить проверкукак это:

if (moulding.id == 2) {//do something};
0 голосов
/ 08 декабря 2010

На данный момент молдинги - это список одноэлементных хэшей. Вы хотите, чтобы это были идентификаторы с одним хэшем, отображающие хэши.

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