В Синатре как рендерить json? - PullRequest
1 голос
/ 03 июня 2019

Мне очень странно, что все в порядке:

  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 

1 Ответ

7 голосов
/ 03 июня 2019

Поскольку в последнем случае предполагается, что вы вызываете метод json с блоком, а foo: 'bar' является недопустимым оператором. * Т.е. 1003 *

json { foo: 'bar' }

анализируется (почти) так же, как

json do
  foo: 'bar'
end

это ерунда. («почти», потому что приоритет скобок и do...end немного отличается; не то, чтобы это имело значение в этом случае.)

В первом случае предполагается, что foo: 'bar' является именованным аргументом и преобразуется в Hash. json({ foo: 'bar' }) сделает очевидным, что вы передаете Hash, а не пишете блок. Таким образом, ниже приведен правильный синтаксис того, что вы пытаетесь написать:

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

Вы также можете использовать подход с использованием ключевых слов (хотя я считаю, что он менее читабелен):

get '/initialize' do
  json item1: { 
           item2: {
               item3: 'ok'
           }
       }
end 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...