2015-10-30 4 views
1

Я хочу использовать переменную контроллера в своем javascript.Используйте переменную контроллера в javascript (Ruby on Rails)

Поскольку это невозможно сделать просто. Я использую gon gem. https://github.com/gazay/gon

С этим я занимаюсь фильтром перед моим базовым контроллером (который действует как фильтр перед всеми контроллерами). Gon.variable_name = value И в моем js-файле я использую gon.variable_name. Это отлично подходит для полной перезагрузки страницы.

Но переменная не обновляется для запроса ajax.

Скажем, например:

На перезагрузки страницы, в моем контроллере я

gon.variable_name = value1 

и в моих JS, gon.variable_name дает мне value1.

После АЯКС запроса в мой контроллер я

gon.variable_name = value2 

и в моих JS, я все еще вижу gon.variable_name как только value1.

Можно ли каким-либо образом обновить gon.variable_name в запросе ajax?

Благодаря

+0

Ваш запрос ajax предположительно возвращает некоторый json? Вот где ваше значение2 должно идти. Затем, в обработчике успеха этого запроса вы извлекаете value2 из ответа и используете его. –

ответ

0

Мне нужно инициализировать gon для каждого запроса inorder для обновления переменных.

include_gon (: INIT => верно)

в ответ на каждый запрос решить эту проблему.

Extra Кончик: Для тех, кто использует ajaxify рельсы драгоценного камня вы можете назвать этот вспомогательный метод в методе ajaxify_extra_content и в content_inserted обратного вызова вы можете добавить это в голове тег, чтобы заставить его работать в общем виде.

Спасибо всем за ваши предложения и помощь.

0

Вы можете использовать переключатель watch: true для gon:

#app/views/layouts/application.html.erb 
<head> 
    <%= include_gon(watch: true) %> 

#app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base 
    def update_vars 
     @value1 = User.count 
     gon.watch.value1 = @users_count 
    end 
end 

Это то, что сказано в документации. Я не согласен с этим, но должен работать. Похоже, ajax polling, который, как известно, неэффективен.

-

Чтобы дать вам некоторый контекст, вы должны помнить, что gon в основном создает небольшой хэш JavaScript в вашем layout, заселение его с gon переменных вы назначены в контроллере:

<script> 
    gon = { 
     value1: "test", 
     value2: "test" 
    } 
</script> 

Мы использовали его раньше здесь:

enter image description here

Причина, по которой это важно, заключается в том, что переменная JS gon вызывается во время выполнения - это означает, что она остается статической, пока вы не перезагрузите страницу.

Обойти это либо динамически перезагружать значения переменных gon (используя watch выше) или передать новое значение по вашему запросу AJAX (как Sergio рекомендуется в комментариях):

#app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base 
    def update 
     respond_to do |format| 
     format.json { render json: {value_2: "test"}.to_json %> 
     end 
    end 
end 

You 'd, то можно использовать его следующим образом:

$.ajax({ 
    url: "/update", 
    success: function(data) { 
     var value2 = data.value2; 
    } 
}); 
+0

Рич Пек и Серхио, спасибо. Здесь для всех запросов ajax в моем приложении я хочу, чтобы что-то обновлялось в представлении через js, и для этого мне нужны значения из db. Чтобы сделать его общим, у меня есть метод, который вызывается после каждого запроса и внутри него. Мне нужно, чтобы значение было доступно. Поскольку он находится в общем файле активов (для его получения), у меня нет доступа к переменной контроллера. По этой причине я подумал об использовании gon, чтобы в переднем фильтре установить значение gon variables и в js I используй это. К сожалению, gon.watch также не работает для меня. Когда я пытаюсь распечатать, он говорит undefined – user001

+0

. Я не понимаю? –

+0

Hi Rich Peck, Что нужно сделать, это сохранить некоторые значения из db в переменной gon и обновить их с помощью каждого запроса ajax. И я выполняю некоторые операции в своем файле javascript, используя эти значения. Но переменные gon не обновляются с помощью ajax-запроса. (Только на странице reload он обновляется.) – user001

Смежные вопросы