Як в Рейлах ви робите візуалізацію JSON за допомогою перегляду?


125

Припустимо, ви перебуваєте в контролері своїх користувачів і хочете отримати відповідь json на запит на шоу, було б непогано, якби ви могли створити файл у своїх переглядах / користувачах / редакторі на ім’я show.json та після того, як ваші користувачі # шоу дію завершено, вона надає файл.

В даний час вам потрібно зробити щось відповідно до:

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json{
      render :json => @user.to_json
    }
  end
end

Але було б добре, якби ви могли просто створити файл show.json, який автоматично виводиться так:

def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

Це врятувало б мені багато горя і змило б це жахливо брудне відчуття, яке виникає, коли я передаю свій json в контролер


Дивлячись на цю посаду зараз, схоже, це не дуже мене врятує, але у мене є складніші випадки, повірте мені, коли я кажу, що це заподіює мені головний біль
Матвій

1
У Rails 3 можна просто зателефонувати format.jsonз show.json.erbфайлом. Дивіться мою відповідь.
Джеймс Лім

Відповіді:


64

Ви повинні мати можливість зробити щось подібне у своєму respond_toблоці:

respond_to do |format|
    format.json 
    render :partial => "users/show.json"
end

який відобразить шаблон у app/views/users/_show.json.erb.


5
Це добре, але ви швидко знайдете erb - це болісний спосіб генерувати json. Ознайомтеся з моєю відповіддю щодо деяких варіантів.
tybro0103

1
Чи є спосіб це зробити без використання часткового?
Вілліям Джадд

55

Спробуйте додати представлення. users/show.json.erbЦе має бути надано, коли ви робите запит на формат JSON, і ви отримуєте додаткову перевагу від того, що він також буде наданий erb, і ваш файл може виглядати приблизно так

{
    "first_name": "<%= @user.first_name.to_json %>",
    "last_name": "<%= @user.last_name.to_json %>"
}

9
Ви можете використовувати @user.first_name.to_jsonзамість цього escape_javascript. Існують деякі тонкі відмінності між тим, що дозволяє JS, і суворо JSON. (І ці відмінності стають важливими, коли браузери впроваджують власні парсери JSON.)
Джеймс А. Росен

1
Вам, мабуть, слід змінити одиничні лапки на подвійні лапки, оскільки JSON (на відміну від JS) приймає лише рядки з подвійним котируванням.
Abe Voelker

1
Це добре, але ви швидко знайдете erb - це болісний спосіб генерувати json. Ознайомтеся з моєю відповіддю щодо деяких варіантів.
tybro0103

Я знаю, що це стара відповідь, але це абсолютно неправильно. to_json поверне вже "" сформовану рядок json, тому отриманий json ніколи не буде дійсним із додатковими лапками ("" значення ""). Крім того, якщо ім'я користувача - нульове, отриманий json буде мати значення "null" як значення. Також <% = використовує html-біг, який буде манглювати символи html у вхідних даних.
d4n3

Я думаю, вам також потрібно видалити цитати навколо, <%= xyz.to_json %>інакше у вас залишиться зайві цитати.
акостадінов

32

Як уже згадували інші, вам потрібен перегляд користувачів / show.json, але існують варіанти врахування мови шаблону ...

ЄРБ

Працює поза коробкою. Чудово підходить для HTML, але ви швидко знайдете, що це JSON жахливо.

RABL

Гарне рішення. Доведеться додати залежність та вивчити її DSL.

JSON Builder

Те саме, що і RABL: Гарне рішення. Доведеться додати залежність та вивчити її DSL.

Звичайний Рубін

Ruby є приголомшливим у створенні JSON, і нічого нового навчитися не можна, оскільки ви можете зателефонувати to_jsonна об’єкт Hash або AR. Просто зареєструйте розширення .rb для шаблонів (в ініціалізаторі):

ActionView::Template.register_template_handler(:rb, :source.to_proc)

Потім створіть перегляд користувачів / show.json.rb:

@user.to_json

Для отримання додаткової інформації про цей підхід см http://railscasts.com/episodes/379-template-handlers


7
Зауважте, що в рейках 4 обробник шаблонів .ruby зареєстрований за замовчуванням github.com/rails/rails/commit/de1060f4e02925c12004f2, щоб ви могли пропустити реєстрацію .rb та назвати користувачів файлу / show.json.ruby.
Тім Діггінс

1
Крім того, щоб оновити це далі, json_builder витіснив github.com/rails/jbuilder .
Тім Діггінс

27

RABL - це, мабуть, найприємніше рішення цього рішення, яке я бачив, якщо ви шукаєте більш чисту альтернативу синтаксису ERb. json_builder та argonaut, які є іншими рішеннями, здаються дещо застарілими і не працюватимуть з Rails 3.1 без деякої латки.

RABL доступний через дорогоцінний камінь або перегляньте сховище GitHub; хороші приклади теж

https://github.com/nesquena/rabl


21

Просто оновити цю відповідь заради інших, які трапляються на цій сторінці.

У Rails 3 вам просто потрібно створити файл на views/users/show.json.erb. @userОб'єкт буде доступний для перегляду (так само , як це було б для HTML.) Ви навіть не потрібно to_jsonбільше.

Підводячи підсумок, це просто

# users contoller
def show
  @user = User.find( params[:id] )
  respond_to do |format|
    format.html
    format.json
  end
end

і

/* views/users/show.json.erb */
{
    "name" : "<%= @user.name %>"
}

1
Я відповів на це 1,5 роки тому. В даний час я просто використовую response_with, коли мені потрібен JSON, наприклад respond_with @user, only: [:name]. Для отримання додаткової інформації зверніться до цього підручника .
Джеймс Лім

1
Просто додати до цієї відповіді, це насправді небезпечно з двох причин: це дозволяє вводити дані користувачів, тому що вони не уникають нових рядків і зворотних косих рядків, а також <% = html уникає даних, тому, наприклад, Шон О'Коннор буде мати своє ім'я притулився до Шона О Коннора.
d4n3

10

Просто додайте show.json.erbфайл із вмістом

<%= @user.to_json %>

Іноді це корисно, коли потрібні додаткові допоміжні методи, недоступні в контролері, тобто image_path(@user.avatar)чи щось для створення додаткових властивостей у JSON:

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>

8
Це повинно бути, <%= raw(@user.to_json) %>щоб не уникнути HTML. Що я роблю, це те, що я покладаюся на to_json до тих пір, поки він дає мені те, що я хочу, але коли я хочу зробити щось інше, я шаблоную його з тим, що зазвичай є { :blah => @user.the_blah }.to_json.
clacke


0

Я новачок у RoR - це те, що я дізнався. Ви можете безпосередньо надати формат json

def YOUR_METHOD_HERE
  users = User.all
  render json: {allUsers: users} # ! rendering all users
END
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.