要显示属于用户的集合列表,我有:
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指南。