在Sinatra中,如何呈现json?

时间:2019-06-03 10:48:04

标签: ruby sinatra

我觉得这很奇怪,这很正常:

  get '/initialize' do
    # ok 
    json foo: 'bar'
  end 

但是这会导致错误:

  get '/initialize' do
    json { foo: 'bar' }   # error! 
  end 
  

语法错误,意外的':',预期为'}'(SyntaxError)

为什么?

如何编写类似以下代码:

  get '/initialize' do
    json { 
         item1: { 
             item2: {
                 item3: 'ok'
             }
         } 
    }

  end 

2 个答案:

答案 0 :(得分:7)

因为后一种情况假设您正在使用块调用json方法,而foo: 'bar'是无效的语句。即

json { foo: 'bar' }

的解析方式(几乎)与

json do
  foo: 'bar'
end

这是胡说八道。 (“几乎”是因为括号和do...end的优先级略有不同;在这种情况下并不重要。)

前一种情况假设foo: 'bar'是一个命名参数,并转换为Hashjson({ foo: 'bar' })会明确表明您正在传递Hash,而不是编写块。因此,以下是您尝试编写的正确语法:

get '/initialize' do
  json({ 
       item1: { 
           item2: {
               item3: 'ok'
           }
       } 
  })
end 

您也可以使用关键字方法(尽管我发现它的可读性较差):

get '/initialize' do
  json item1: { 
           item2: {
               item3: 'ok'
           }
       }
end 

答案 1 :(得分:1)

它对我有用:

get '/songs' do
    content_type :json
    { song: "Wake me Up" }.to_json
end