2016-09-19 43 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

这近乎有效,有两个座位,这是返回最后一个座位 –