ruby on rails, результаты поиска в массиве json (jbuilder)

Я новичок в рельсах, и у меня есть быстрый вопрос...

У меня есть гем календаря, который в настоящее время извлекает данные о событиях из json как такового (viewings/index.json.jbuilder)

json.array!(@viewings) do |viewing|
  json.extract! viewing, :id, :room_id, :user_id, :start_time, :end_time, :notes
  json.title viewing.user.name
  json.start viewing.start_time
  json.end viewing.end_time
  json.url viewing_url(viewing, format: :html)
end

в любом случае, я создал функцию поиска на своей индексной странице «просмотры», где пользователь выбирает комнату из раскрывающегося списка, и он отображает соответствующие просмотры.

Однако мне нужно сделать массив JSON из результатов поиска, чтобы его можно было скормить календарю.

Я знаю, что могу добиться этого, выполнив что-то вроде, что действительно работает:

@viewings = Viewing.where(room_id: 1 )

но, очевидно, я хочу передать переменную в эту строку кода, что-то вроде

@viewings = Viewing.where(room_id: params[:search_string] )

Строка поиска всегда будет идентификатором комнаты, но приведенный выше код (и любые варианты, которые я могу придумать), похоже, не работают.

ИЛИ могу ли я сделать массив JSON из результатов поиска. мой поиск такой...

  def search
    @rooms = Room.all
        @viewings = Viewing.simple_search(params[:search_string])
        render :action => "index"
  end

Кто-нибудь может помочь?!

РЕДАКТИРОВАТЬ:

Я все еще много борюсь с этим. Я просмотрел страницу jquery ниже, но она все еще не делает то, на что я надеялся.

Я упростил функцию в своем контроллере просмотра следующим образом:

  def rmselect
    @query1 = params[:rmno]
    @rooms = Room.all
        @viewings=Room.find(params[:rmno]).viewings
    render :action => "index"
  end

И я создал _rmselect.json.jbuilder следующим образом:

@viewings = Viewing.where(room_id: @query1 )
json.array!(@viewings) do |viewing|

  json.title viewing.user.name
  json.start viewing.start_time
  json.end viewing.end_time

end

Я надеялся, что переменная @query1 будет передана на страницу jbuilder, что заставит ее отображать просмотры только для выбранной комнаты. Однако кажется, что jbuilder не может видеть никаких переменных, если они не находятся в def index (где это нехорошо).

Я также не могу понять, почему _rmselect.json.jbuilder берет @viewings.all у def index, а не @viewings=Room.find(params[:rmno]).viewings у def rmselect.


person Mitch    schedule 18.02.2015    source источник


Ответы (1)


Хорошо, я полагаю, что ситуация такова:

Просмотр модели:

class Viewing < ActiveRecord::Base
   ...
   belongs_to :room
   ...
end

Модель комнаты:

class Room < ActiveRecord::Base
   ...
   has_many :viewings
   ...
end

Получить просмотры из идентификатора комнаты, вы можете сделать что-то вроде:

@viewings=Room.find(params[:search_string]).viewings

Для создания массива результатов JSON отобразите представление jbuilder, которое содержит что-то вроде этого:

# @people = People.all

json.array! @people, :id, :name

  # => [ { "id": 1, "name": "David" },      { "id": 2, "name": "Jamie" } ]

Я сообщаю пример официального jbuilder docs Я думаю, вы можете использовать json. массив с просмотрами:

json.array! @viewings, field1, field2, ...

В противном случае вы можете использовать это в своем контроллере:

render json: @viewings

но если вы использовали jbuilder, я думаю, вам лучше продолжать в том же духе.

person GeekRiky    schedule 18.02.2015
comment
Привет, спасибо, что нашли время ответить. К сожалению, ваша ссылка кажется мертвой, и я не знаю, как ее найти. - person Mitch; 19.02.2015
comment
Я полагаю, что params[:search_string] представляет собой массив идентификаторов и выглядит так: [1,2,3]. Если я предполагаю, что правильный метод поиска возвращает массив объектов. - person GeekRiky; 19.02.2015
comment
Если search_string является строкой массива Json, вы можете использовать эту библиотеку для строки синтаксического анализа, а затем использовать find. - person GeekRiky; 19.02.2015
comment
извините, вероятно, это моя вина, что я плохо объяснил, но search_string - это не массив json, это ввод из поля выбора. мне нужно извлечь результаты после поиска здесь code@viewings = Viewing.simple_search(params[:search_string])code - person Mitch; 19.02.2015
comment
Хорошо, если у вас есть room_id, вы можете искать эту комнату и получать просмотры: @viewings=Room.find(params[:search_string]).viewings - person GeekRiky; 19.02.2015
comment
Хорошо, это отлично работает, но есть идеи, как я могу создать массив JSON результатов, полученных из @viewings=Room.find(params[:search_string]).viewings - person Mitch; 20.02.2015
comment
Спасибо еще раз за помощь. все еще есть проблемы, если бы вы могли взглянуть на мое редактирование, чтобы увидеть, где я ошибаюсь, это было бы здорово! - person Mitch; 21.02.2015
comment
При вызове render action: ... выполняется индексное действие текущего контроллера. Почему вы называете действие рендеринга? Я могу предположить, что вы хотели вызывать только индексное представление, если это так, вы можете использовать render 'index' - person GeekRiky; 22.02.2015
comment
Спасибо, я изменил это сейчас, но это не помогло, мой jbuilder все еще создает массив для @viewings.all, а не @viewings=Room.find(params[:search_string]).viewings, который я тоже хочу? - person Mitch; 23.02.2015