2011-11-06 73 views
2

我正在寻找清理我的控制器,因为它看起来很重且很多。不胜感激任何关于如何将这种类型的逻辑转移到我的模型中的帮助。感谢有这方面的帮助 - 下面的代码是我的索引操作:导轨 - 将控制器逻辑转移到模型中

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

看起来像MetaSearch,MetaWhere或Ransack可以帮助您。 –

回答

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人对这个问题的看法。

+0

感谢戴夫 - 基于我需要做的事情,我将创建单独的路线。我玩了一下,发现这是我的最佳选择 - 感谢您的输入! – Gavin

+0

@Gavin没问题 - 有时它是最干净,最容易维护的事情,无论好坏。 –

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 

取代你只需要使用相同的参数键观众和主题

+1

我发现那些比天真的解决方案更不明显也更难读的东西(这就是为什么我只是在回答中提到它的原因)。 –