如何清空Rails控制器并避免在每次操作中声明此变量



要显示属于用户的集合列表,我有:

if user_signed_in?
@user_collections = current_user.collections.paginate(page: params[:collections_page], :per_page => 10)
end

<%= render @user_collections %>

然而,每当我使用Ajax执行某种操作(如添加到集合、创建新集合等(时,我都希望刷新这个集合列表。似乎我必须在每个操作中初始化@user_collections。

有更好的方法吗?

另一种DRY逻辑的做法:


class YourController < ApplicationController
def get_user_collections
@user_collections = user_collections(params[:collections_page], 10) if user_signed_in?
end
private
def user_collections(collections_page, users_per_page)
current_user.collections.paginate(page: collections_page, :per_page =>users_per_page)
end
end

For more you can look up to in this link.

As @felixbuenemann mentioned, you can DRY the logic.

For example,

class YourController < ApplicationController
before_action :load_user_collections
private
def load_user_collections
if user_signed_in?
@user_collections ||= current_user.collections.paginate(page: params[:collections_page], :per_page => 10)
end
end
end

如果你担心繁重的sql查询,那么缓存呢?

if user_signed_in?
@user_collections = Rails.cache.fetch("#{current_user.id}", expires_in: 5.minutes) do
current_user.collections.paginate(page: params[:collections_page], :per_page => 10)
end
end

您可以使用before_action来共享多个操作的行为。

有关更多信息,请参阅过滤器上的Rails指南。

最新更新