2015-11-14 3 views
3

Я пытаюсь реализовать индикатор выполнения (Javascript) с приложением Ruby on Rails, но мне не удается передать значения от контроллера в JS для обновления панели.Как передать переменную из Rails в Ajax

Первоначально я попытался использовать простую глобальную переменную ($ count), но после загрузки переменная всегда одна и та же. Он не обновляется в стороне JS.

EDIT:

Теперь я использую гон драгоценный камень, чтобы передать значение. Но я получаю только первое значение (которое было установлено при запуске контроллера). Когда я вызываю метод, вызванный нажатием кнопки, значение обновляется, но переменная gon всегда одна и та же. Может быть, ошибка в рельсах/контроллере?

Я увидел пример с методом, чтобы вывести переменную в gon, но не работает.

Примечание: Если удалить инициализацию перед началом поиска, если при поиске щёлкнули JS сторона показывает "гон переменной неопределенную"

Пример кода: application_controller.rb

def application 
    @count =0 #gon assumes only this value 
    exposeUnProcessedJobToJavascript 

    if params[:search] 

    while(@count < 10) 
     exposeUnProcessedJobToJavascript 
     sleep 3 
     @count +=1 
    end 
    end 
    def exposeUnProcessedJobToJavascript 
    gon.watch.job = @count 
    end 
end 

application.js. erb

function addJobWatchers() { 

    if (gon.job != undefined) { 

    gon.watch('job', { 
     interval: 1000 
    }, updateProcessingJob); 
    } 
} 

function updateProcessingJob(job) { 

    if (job) { 
    console.log("JOB: " + job); 
    } 
} 

$(document).on('page:change', function() { 
$("#search_button").click(function() { 
    console.log("click search"); 
    if (typeof gon !== 'undefined') { 
     addJobWatchers(); 
    } 
});}); 

ответ

0

Проблема, похоже, связана с классом. Когда Ajax пытается получить доступ к методу внутри контроллера класса, он создается снова, очищая все переменные. Я решил проблему, используя Rails.cache.write (: count, 0) и Rails.cache.read (: count) для отображения значения. Совет: Не работает для многопользовательских устройств. Кэш Rails разделяется между сеансами.

1

Вот драгоценный камень, который может помочь вам в этом. У этого есть много объяснений и примеров, чтобы вы начали.

https://github.com/gazay/gon

+0

Я уже пробовал gon gem, но он тоже не работал. Дайте ошибку при попытке доступа к переменной в js-стороне «: undefined». Вы знаете ошибку? – koxta

+0

Как вы устанавливаете переменную gon в бэкэнд и как вы называете ее на стороне js? –

+0

В контроллере я устанавливаю его gon.var = 50 и в js-файле пытаюсь получить gon.var. Только это. С gon требуется в заголовке HTML-файла. – koxta

0

Я считаю, что эта ссылка будет делать то, что вы ищете. Вам не нужен камень Gon. Вы должны должны сделать '<% = Var%>' только

http://railscasts.com/episodes/324-passing-data-to-javascript?view=asciicast

<%= javascript_tag do %> 
    window.productsURL = '<%= j products_url %>'; 
    window.products = <%= raw Product.limit(10).to_json %> 
<% end %> 

Не лучшая практика Путь:

Поскольку у вас уже есть @count глобально в шаблоне. Установите его в атрибут данных. Затем в вашем javascript возьмите этот атрибут данных. Но это анти-шаблон.

+0

Как я упоминал в сообщении, возможно, это проблема с контроллером. Я могу получить значение переменной при запуске контроллера. когда я вызываю поиск, переменная не обновляется. Пожалуйста, взгляните на новый код, если вы можете найти проблему. Благодарю. – koxta

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