目前我有一个有布局的幻灯片模型。
幻灯片放映操作根据布局呈现不同的内容,但每个布局需要查询不同的模型。目前我的控制器中有一个case语句,根据我的需要加载需求。
e.g。
def show
@slide = Slide.find(params[:id]
case @slide.layout
when 'products'
@products = Product.where(display: true)
when 'strategy'
@strategy = Strategy.all
when 'summary'
@quit_attempt = QuitAttempt.where(user_id: current_user.id)
@user_products = Product.where(user_id: current_user.id)
@habits = Habit.all
end
end
这是解决这个问题的最佳方法吗?有更多的布局有不同的要求,它导致一个大的控制器动作。作为替代方案,我还能做些什么。
我想我可以在模型中定义一个方法来获取它们并将一个数组传递回控制器,nil用于不需要的东西,例如。
@products, @strategy, @habits = @slide.layout_requirements
如何重构这一点,我们将不胜感激。
答案 0 :(得分:1)
我不知道这是否是最干净的方法,但你可以试试这个
在控制器中定义3个方法
def product_data
@products = Product.where(display: true)
end
def strategy_data
@strategy = Strategy.all
end
def summary_data
@quit_attempt = QuitAttempt.where(user_id: current_user.id)
@user_products = Product.where(user_id: current_user.id)
@habits = Habit.all
end
然后在show action中写如下
def show
@slide = Slide.find(params[:id]
eval("#{@slide.layout}_data")
end
这应该有效:)
P.S。最好您必须找到一种方法将这些查询模式化为模型。在控制器中编写如此多的代码并不是传统的