Получение 406 (неприемлемо) для Ajax action Rails 4

Я пытаюсь автоматически обновлять одно частичное представление каждые 60 секунд на странице индекса. Я попытался разделить действия на два маршрута, чтобы JS было легче изменить и управлять. Кажется, проблема с блоком respond_to, может быть, вы можете помочь мне с лучшим подходом.

feed_controller.рубидий

def index
 @hashtags = hashtag_refresh
end

def hashtag_refresh
 Hashtag.order('created_at DESC').limit(10).uniq
 respond_to do |format|
  format.js
end
end

лентаhashtag_refresh.js.Эрб

 $('.trends_li_container').html("<%= escape_javascript(render('feed/shared/hashtag_list')).html_safe %>");

маршруты.рубидий

get 'feed/hashtag_refresh', to: 'feed#hashtag_refresh'

hashtag_autorefresh.js

//Refresh Hashtags Partial
$(document).ready(function (){
    setTimeout(refreshHashtag, 60000)
});

//Calls action refreshing the partial
function refreshHashtag() {
    $.ajax({
        url: 'feed/hashtag_refresh',
        type: 'GET',
        dataType: 'script'
    })
}

лента / общая / папка
_hashtag_list.формат html.Эрб

папка feed / controller
hashtag_refresh.js.Эрб

Журнал Разработки Сервера

  Started GET "/feed/hashtag_refresh?_=1462210930323" for 127.0.0.1 at 2016-05-02 13:45:05 -0400
    Processing by FeedController#hashtag_refresh as JS
      Parameters: {"_"=>"1462210930323"}
      User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 5]]
      Rendered feed/shared/_hashtag_list.html.erb (0.0ms)
      Rendered feed/hashtag_refresh.js.erb (11.5ms)
    Completed 200 OK in 50ms (Views: 47.5ms | ActiveRecord: 0.0ms)

2 ответа

  1. попробуйте изменить функцию refreshHashtag()на эту

    //Calls action refreshing the partial
    function refreshHashtag() {
        $.ajax({
            url: 'feed/hashtag_refresh'
            type: 'GET', //POST
            dataType: 'script'
        })
    }
    
  2. Я думаю, что проблема заключается в возврате значения hashtag_refresh. Вы ожидаете, что он вернет коллекцию Hashtags, но на самом деле он возвращает возвращаемое значение respond_to, которое я не знаю, что это на самом деле 😛

    Попробуйте изменить контроллер следующим образом:

    def index
      hashtag_refresh do |hashtags|
        @hashtags = hashtags
      end
    end
    
    def hashtag_refresh
      yield Hashtag.order('created_at DESC').limit(10).uniq
      respond_to do |format|
        format.js
      end
    end
    

    И ваш javascript

    // Refresh Hashtags Partial
    $(document).ready(function (){
      setInterval(refreshHashtag, 60000)
    });
    
    
    // Calls action refreshing the partial
    function refreshHashtag() {
      $.ajax({
        url: 'feed/hashtag_refresh.js',
        dataType: 'javascript'
      })
    }
    

    Кстати, setTimeoutрекурсивный вызов предпочтительнееsetInterval, потому setIntervalчто требует отмены вручную, и если вы забудете отменить, он будет работать вечно. Таким образом, ваш javascript может быть таким:

    //Refresh Hashtags Partial
    $(document).ready(function (){
      (function refreshHashtag() {
        $.ajax({
          url: 'feed/hashtag_refresh.js',
          dataType: 'javascript'
        }).then(function() {
          setTimeout(refreshHashtag, 60000);
        });
      })();
    }); 
    

    Надеюсь, что это решит вашу проблему 🙂

    ОБНОВЛЕНИЕ

    Если вы получили ошибкуActionController::UnknownFormat, то это просто означает, что rails не распознают формат jsили тип mime text/javascript. Мы можем научить rails, добавив некоторые конфигурации вconfig/initializers/mime_types.rb

    config/initializers / mime_types.рубидий

    # The RFC standard mime type for javascript
    Mime::Type.register "application/javascript", :js
    
    # The legacy but widely used mime types for javascript
    Mime::Type.register "text/javascript", :js
    Mime::Type.register "application/x-javascript", :js