我正在寻找清理我的控制器,因为它似乎很重且多余。关于我如何将这种类型的逻辑移动到我的模型中的任何帮助将不胜感激。感谢您对此的任何帮助 - 以下代码是我的索引操作:
case params[:find_by]
when 'topic'
nuggets = Nugget.where(['topic = ?', params[:topic_name]])
@nuggets = nuggets.paginate(:page => params[:page],:per_page => 15)
@title = nuggets.first.topic
when 'audience'
nuggets = Nugget.where(['audience = ?', params[:audience_name]])
@nuggets = nuggets.paginate(:page => params[:page], :per_page => 15)
@title = nuggets.first.audience
else
@nuggets = Nugget.paginate(:page => params[:page], :per_page => 15)
end
答案 0 :(得分:1)
我不完全确定将移动到模型中。我可能只是将它移动到控制器中的私有实用程序方法中。
case params[:find_by]
when 'topic'
nuggets = Nugget.find_by_topic(params[:topic_name])
@title = nuggets.first.topic
when 'audience'
nuggets = Nugget.find_by_audience(params[:audience_name])
@title = nuggets.first.audience
else
nuggets = Nugget.all
end
@nuggets = Nugget.paginate(:page => params[:page], :per_page => 15)
另一种选择是为不同的发现创建路线;不管它是否值得,嗯。您可以将find_by逻辑移动到模型中,或使用send
稍微干掉主题/受众群体的差异,但同样,这似乎比它的价值更麻烦。
我会很高兴看到Rails-y的人会对这个问题有什么看法。
答案 1 :(得分:1)
将此添加到您的模型
def self.topic(topic_name)
where(:topic => topic_name)
end
def self.audience(audience_name)
where(:audience => audience_name)
end
在控制器中替换为
def index
if params[:find_by]
nuggets = Nugget.send(params[:find_by].to_sym)(params[:name])
@nuggets = nuggets.paginate(:page => params[:page], :per_page => 15)
else
@nuggets = Nugget.paginate(:page => params[:page], :per_page => 15)
end
@title = @nuggets.first.send(params[:find_by].to_sym)
end
您只需要为受众和主题使用相同的参数键