2016-09-19 44 views
0

所以我tyring OT在我的控制器雙重渲染錯誤軌道控制器

到目前爲止,它看起來像這樣

def url 
    require 'json' 
    url = url appears here 
    doc = Nokogiri::HTML(open(url)) 
    doc.css(".ticket-price .h4").each do |t| 
     json = t.text 
     respond_to do |format| 
     format.json { render :json => {:seatname => json}} 
     end 
    end 
    end 

但是創建自定義的方法,當我運行此我得到這個錯誤

AbstractController::DoubleRenderError 

我看不到它被稱爲兩次?我的猜測是,因爲它在每個陳述內。什麼是可顯示回來JSON兩座名的最好辦法,使它看起來像這樣:

"seatname": "seat1", 
"seatname": "seat2" 

感謝 山姆

+1

將'respond_to'塊移出循環 –

+0

嘗試了這個,得到一個錯誤,它找不到json,更改了@json並且只獲得最後一個座位 –

回答

0

這應該工作:

def url 
    require 'json' 
    url = url appears here 
    doc = Nokogiri::HTML(open(url)) 

    // Constructing an array of hash 
    response_hash = doc.css(".ticket-price .h4").map{ |t| {seatname: t.text} } 

    respond_to do |format| 
     format.json { render :json => response_hash } 
    end 
end 

像Max在你的代碼中提到,respond_to被調用每一個匹配的元素。相反,你可以構造一個散列數組,然後渲染它。

0

這給一個鏡頭:

def url 
    require 'json' 
    url = url appears here 
    doc = Nokogiri::HTML(open(url)) 

    response_hash = doc.css(".ticket-price .h4").map { |t| ["seatname", t.text] }.to_h 

    respond_to do |format| 
    format.json { render :json => response_hash } 
    end 
end 

在您當前的代碼中,對於doc.css(...)的返回值中的每個匹配元素,respond_to塊將被調用一次,這會導致DoubleRenderError。爲了解決這個問題,你需要分離構建你的響應數據和實際發送數據。這有幫助嗎?

+0

這近乎有效,有兩個座位,這是返回最後一個座位 –