在控制器动作之间共享数据

时间:2018-10-10 03:18:20

标签: ruby-on-rails

我有一个应用程序,该应用程序呈现一个内部具有链接的div,该应用程序使用AJAX更新了该div的外观。问题在于,Rails必须在切换视图时一遍又一遍地请求相同的数据,这似乎效率很低。

在阅读了控制器动作之间共享变量的主题之后,我了解到由于无状态的性质,这是不可能的。还已经阅读了会话不应该用于存储对象,并且这些变量包含大量数据,主要用于生成图形。我猜另一个选择是缓存,我不太熟悉。或者可以在浏览器中的Javascript中保存变量。

有人有类似的问题可以提供一些指导吗?

class ArtistsController < ApplicationController

    def index
        if params[:term]
            respond_to do |format|
                format.html
                format.js {render "show.js.haml"}
            end
        else
            @artists= Artist.all
        end
    end

    def show
        @days=90

        # DATABASE QUERIES
        @artist= Artist.find(params[:id])
        @reach_period= Reachupdate.period(@artist.id,@days)
        @update_period=Update.period(@artist.id,@days)
        @songs_load= Song.by_artist(@artist.id).joins(:playlists)
        @song_period= @songs_load.period(@days)

        # CHART
        @updates= ChartTransformation::pop_chart(@update_period,@days)
        @reach = ChartTransformation::reach_chart(@reach_period,@days)
        @dates= ChartTransformation::dates(@days,3)
        @reach_labels= ChartTransformation::reach_labels(@reach_period,2)
        @songs= ChartTransformation::data_to_releases(@song_period, @days)
        @reach_diff = Reachupdate.diff(@reach_period)
        @pop_diff = Update.diff(@update_period)
        @playlisting= ChartTransformation::playlisting(Playlist.by_artist(@artist.id),@days)

    end

    def overview
        @days=90

        # DATABASE QUERIES
        @artist= Artist.find(params[:id])
        @reach_period= Reachupdate.period(@artist.id,@days)
        @update_period=Update.period(@artist.id,@days)
        @song_period= Song.by_artist(@artist.id).period(@days) 

        # CHART
        @updates= ChartTransformation::pop_chart(@update_period,@days)
        @reach = ChartTransformation::reach_chart(@reach_period,@days)
        @dates= ChartTransformation::dates(@days,3)
        @reach_labels= ChartTransformation::reach_labels(@reach_period,2)
        @songs= ChartTransformation::data_to_releases(@song_period, @days)
        @reach_diff = Reachupdate.diff(@reach_period)
        @pop_diff = Update.diff(@update_period)
        @playlisting= ChartTransformation::playlisting(Playlist.by_artist(@artist.id),@days)


        respond_to do |format|
            format.js {render "timeline_content.js.haml"}
        end
    end
end

1 个答案:

答案 0 :(得分:0)

  

我猜另一个选择是缓存,我不太熟悉

您必须使自己熟悉缓存。这是您问题的答案。

在您的情况下,它将在视图中进行片段缓存,请阅读指南https://guides.rubyonrails.org/caching_with_rails.html#fragment-caching