双重渲染错误轨道控制器

时间:2016-09-19 14:04:01

标签: ruby-on-rails

所以我要在我的控制器中创建一个自定义方法

到目前为止它看起来像这样

 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"

由于 萨姆

2 个答案:

答案 0 :(得分: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

在您当前的代码中,respond_to块的返回值doc.css(...)中的每个匹配元素都会调用DoubleRenderError块,这会导致app.listen(port) 。要解决这个问题,您需要将响应数据的构建与实际发送分开。这有帮助吗?

答案 1 :(得分: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会为每个匹配元素调用。相反,你可以构造一个哈希数组,然后渲染它。