#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.jbuilder4. Я убрал
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, но угловые данные остаются прежними .. есть идеи?