所以我要在我的控制器中创建一个自定义方法
到目前为止它看起来像这样
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"
由于 萨姆
答案 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
会为每个匹配元素调用。相反,你可以构造一个哈希数组,然后渲染它。