Как опросить одно значение в базе данных с помощью Rails 4, если значение изменится, обновить с помощью AJAX

Я работаю с Rails уже пару лет, но это мой первый опыт работы с AJAX и Javascript. Я провел огромное количество времени, читая различные веб-сайты, пытаясь понять, что куда и что он должен делать.

Я пытаюсь обновить div «refreshme» в edit.html.erb в приложении Rails 4 каждый раз, когда изменяется поле «turn» в таблице «stories». Поэтому я написал функцию setInterval() в story.js для проверки @story.turn и обновления. Я могу заставить его обновляться каждые 10 секунд, но я хочу, чтобы код только проверял значение story.turn каждые 10 секунд и обновлял только в том случае, если значение изменилось.

route.rb (правильно ли это?)

match '/stories/:id/refresh' => "stories#refresh", :as => :story_refresh, via: 'post'

refresh.html.erb (в просмотрах/историях — понятия не имею, что здесь принадлежит)

<div class="pollme" data-story-id="<%[email protected] %>" data-story-turn="<%[email protected] %>" > 
  <%[email protected] %> // This gets changed based on what other users are editing
</div>

edit.html.erb (просмотры/истории) — show.html.erb красиво обновляется в этом div

<div class="refreshme" data-story-id="<%[email protected] %>" data-story-turn="<%[email protected] %>" >
  <%= render 'shared/micropost_form' %>
</div>

история.js

$(document).on("page:change", function() {
  var $turn;
  $turn = $('.refreshme').data('story-turn'); 

  refreshStories = function(){

    $.ajax({     
        type: "POST",
        data: {  },  // I'm sure something important goes here to get @story.turn out of the stories table
        url: "/stories/"+$('.refreshme').data('story-id')+"/refresh"    
    }).done(function(result) {
            alert('done' );
        $turn = ; // Not sure what data{} can return
    })

    if ($('.refreshme').data('story-turn') != $turn) {
      $.ajax({
        type: "GET", // helps show.html.erb get refreshed into refreshme div in edit.html.erb
        url: "/stories/"+$('.refreshme').data('story-id') 
      }).done(function(result) {
        var $sentence_requests = $('.refreshme');
        if ($sentence_requests.length > 0) {
            $sentence_requests.html(result);
            alert('UPDATED micropost requests ') ;
        } else {
        }
      })
    }
  };
  setInterval(refreshStories, 10000); 
});  

stories_controller.rb

def refresh
  @story = Story.find(params[:id])
  respond_to do |format|
    format.json { }  
    format.html { }
  end  
end

def edit
  @story = Story.find(params[:id])
  @micropost  = @story.microposts.build
  respond_to do |format|
    format.json { } 
    format.html { }
  end  
end

В story.js функция GET выполняется, а функция POST — нет. Я не уверен, что я должен «ОТПРАВИТЬ» (я думал, что «ПОЛУЧАЮ» значение из базы данных, но, похоже, это не так).

Я думаю, что POST - это функция AJAX, мне нужно получить @story.turn из таблицы историй, но я не знаю, как заставить ее что-то делать. Мне также нужен GET для обновления? Я ковырялся в этом коде уже несколько недель, похоже, я уже должен был это понять. Любая помощь будет принята с благодарностью.


person ThinQtv    schedule 20.05.2014    source источник


Ответы (1)


Если вы разместите это в общедоступном репозитории github, люди смогут увидеть ваш код в контексте, а также отправить запрос на включение, демонстрирующий, как они это сделают.

person Joe Grossberg    schedule 21.05.2014
comment
Хорошо, Джо, вот мой репозиторий. github.com/crowdpublishtv/sentenceZing Я немного отредактировал его, потому что пробовал RailsCast 229, но это не Я действительно не делаю то, что хочу. Мне нужно обновить @story.turn, чтобы текстовое поле микросообщения отображалось после того, как партнер истории вводит свой микросообщение истории. См. sentenceZing.com для реализации. - person ThinQtv; 22.05.2014
comment
Я попытался посмотреть, но проект находится в сломанном состоянии: rake db:migrate не работает при чистой установке: - person Joe Grossberg; 22.05.2014
comment
Я попытался посмотреть, но проект в сломанном состоянии: rake db:migrate не работает при чистой установке: SQLite3::SQLException: нет такой таблицы: нравится: ALTER TABLE нравится ДОБАВИТЬ user_id целое Я не собираюсь тратить больше время на это, но мой главный вопрос: почему вы считаете, что вам нужен POST? Все, что вам нужно, это AJAX GET, который достигает конечной точки. Пусть эта конечная точка запросит БД и вернет ответ, который даст вам достаточно информации, чтобы сказать, что это значение [не] изменилось. Затем действуйте соответствующим образом, основываясь на этом ответе. Нет необходимости в POST, что подразумевает, что вы меняете данные на сервере. - person Joe Grossberg; 22.05.2014
comment
Также это Угловой вопрос актуален. - person Joe Grossberg; 22.05.2014
comment
Я знаю, что это не отвечает на ваш вопрос, но, надеюсь, этого достаточно, чтобы вы не застряли. - person Joe Grossberg; 22.05.2014
comment
Я как-то решил большую часть этого самостоятельно. Проблема db:migrate заключается в том, что таблица была удалена, а затем добавлена, и db:migrate не знает, как с этим справиться. Я нашел в RailsCast 229 кое-что, что не очень похоже на то, что я в итоге сделал, но дало мне подсказки о том, как собрать решение вместе. - person ThinQtv; 23.05.2014
comment
Да, POST ничего не сделал для меня. Я видел это в примере PHP и подумал, что это похоже. В итоге я создал файл index.js.erb, чтобы получить значение из базы данных, а затем выполнил AJAX GET из index.js.erb. - person ThinQtv; 23.05.2014