Обновление Rails .json.jbuilder

#ruby-on-rails

#ruby-on-rails

Вопрос:

У меня есть базовый файл index.json.jbuilder в clients/index.json.jbuilder:

 json.array!(@clientsAPI) do |client|
  json.extract! client, :year, :business_name
end
  

Когда я отправляю форму, на мой взгляд, @clientsAPI она обновляется в индексном методе clients_controller. Однако index.json.jbuilder не обновляется и оставляет старые @clientsAPI значения (до отправки формы).

Как я могу получить @clientsAPI обновление в index.json.jbuilder при обновлении формы?

контролируемый клиентом код:

 def index
        @clients = Client.all

        begin
          @year_filter = params[:c][:year]
        rescue 
          @year_filter = ["2016"]
        end

        @clientsAPI = @clients.where(year:@year_filter)

        render 'index'
end
  

форма clients/index.html.erb перенаправляется на метод индекса, показанный выше:

 <%= form_for :c, url:clients_path, method: :get" do |f| %>    
  <%= f.select :year, options_for_select(@years),{onchange: "this.form.submit();"} %>
<% end %>
  

Комментарии:

1. Какое действие выполняет ваша форма (создание / обновление и т. Д.)? Не могли бы вы показать код контроллера для этого действия и соответствующий create.json.jbuilder /update.json.jbuilder — я предполагаю, что в @clientsAPI этом действии не задается переменная.

2. Я добавил код контроллера. Форма перенаправляется для выполнения GET запроса к индексному методу. Все в Rails обновляется просто отлично, но по какой-то причине @clientsAPI в index.json.jbuilder не обновляется при отправке формы. Есть идеи, на что здесь обратить внимание? Должен ли jbuilder обновляться при отправке формы?

3. Ваша форма отправляет запрос в формате json или html? Его нужно будет отправить с format: 'json' помощью, а затем вы должны убедиться, что вы отвечаете на формат json в вашем контроллере : respond_to do |format| ...etc . Я не уверен, что делает ваш export_grid_if_requested блок, но если вы доберетесь до него, он будет отображать только HTML-ответ, а не index.json.jbuilder

4. Я убрал export_grid_if_requested so, теперь он всегда попадает в render index Also, я показал форму запроса get. Не могли бы вы опубликовать ответ о том, как render index обновить переменную index.json.jbuilder @clientsAPI и обновить ее?

Ответ №1:

Это непроверено, но, надеюсь, должно подвести вас достаточно близко..

В вашем form_for вам нужно указать ему отправить запрос json. Что-то вроде:

 <%= form_for :c, url:clients_path(format: 'json'), method: :get" do |f| %>
  

затем в вашем индексном методе ответьте на запрос json:

 def index
    @clients = Client.all

    begin
      @year_filter = params[:c][:year]
    rescue 
      @year_filter = ["2016"]
    end

    @clientsAPI = @clients.where(year:@year_filter)

    respond_to do |format|
      format.html {
       render 'index'
       }
      format.json {
       #any logic here specific to a json request.
       #doing nothing will render index.json.jbuilder by default
       }
    end
  

завершение

Комментарии:

1. Итак, это близко. Но тогда он всегда отображает ответ json. Мне это нужно для отображения как json, так и индекса. Вы знаете, как отобразить оба?

2. Что вам нужно сделать как с ответом html, так и с ответом json? Я не думаю, что rails действительно предназначен для отображения нескольких ответов из одного запроса. Должно быть достаточно, чтобы делать то, что вам нужно, с тем или иным форматом

3. У меня есть угловая таблица в представлении, которая считывает . json отвечает и отображает данные. В этом же представлении также отображаются диаграммы, которые находятся в rails. Итак, я пытаюсь отобразить обновленную информацию как в диаграммах rails, так и в таблице angular.

4. В этом случае я бы посоветовал вам отобразить любой HTML-код из rails, а затем, как только angular будет загружен, заставить angular выполнить запрос json (используя службу angular $ http), чтобы получить объект json и загрузить его в соответствующую переменную angular scope .

5. На самом деле это именно то, что делает таблица. Однако по какой-то причине, когда angular выполняет http-запрос $, @clientsAPI переменная в jbuilder не обновляется последними параметрами из формы. Итак, логика контроллера выполняется, обновляет данные rails, но угловые данные остаются прежними .. есть идеи?