【发布时间】:2014-08-12 15:47:18
【问题描述】:
我有一个有几个动作的控制器。许多人遵循这种模式:
def favorites
@favorites = Favorite.where(organization_id: @resource.id).page(params[:page]).per(50)
end
不仅仅是收藏夹,还有下载、搜索、列表等,它们都非常相似,以至于我想创建一个可以在 before_filter 中调用的方法。像这样的:
def set_instance_variable
subject = __method__
class = __method__.singularize.constantize
instance_variable = self.class.instance_variable_set("@#{subject}", "#{class}.where(organization_id: @resource.id).page(params[:page]).per(50)")
end
这里的语法可能有点偏离,但我知道这不会起作用,因为__method__ 将始终是 set_instance_variable 而不是调用它的父方法。
有没有办法根据定义实例变量的方法动态设置实例变量?上面的这个例子是否在正确的轨道上?
【问题讨论】:
-
在我看来像
has_many关联(尤其是您在下面提到的OrganizationsController)。如果您定义了它,您将能够在before_filter中设置@resource(@organization),然后调用@resource.favorites、@resource.downloads等。
标签: ruby ruby-on-rails-4 metaprogramming