2010-12-08 5 views
0

У меня есть следующий код контроллера:Рубин на Rails - JSON формат

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 

Как сменить контроллер для достижения это?

ответ

1

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

@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

Я хочу использовать все данные в канале JSON для расчета на клиенте. Несложно ли получить данные с помощью чего-то типа `data.mouldings.moulding_id_2.cost` и` data.material_costs.mountboard.cost`, а не делать несколько циклов через данные? – freshest 2010-12-08 13:15:14

0

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

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