Ruby on rails 3 Rails—将控制器逻辑移动到模型中
我想清理一下我的控制器,因为它看起来很重而且多余。如果您能帮助我将这种逻辑移植到我的模型中,我将不胜感激。感谢您在这方面的帮助-下面的代码是我的索引操作:Ruby on rails 3 Rails—将控制器逻辑移动到模型中,ruby-on-rails-3,model,controller,logic,Ruby On Rails 3,Model,Controller,Logic,我想清理一下我的控制器,因为它看起来很重而且多余。如果您能帮助我将这种逻辑移植到我的模型中,我将不胜感激。感谢您在这方面的帮助-下面的代码是我的索引操作: case params[:find_by] when 'topic' nuggets = Nugget.where(['topic = ?', params[:topic_name]]) @nuggets = nuggets.paginate(:page => params[:page],:per_page =>
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
我不完全确定我是否会将其移动到模型中。我可能只是将它移动到控制器中的一个私有实用程序方法中
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 logic移动到模型中,或者使用send
稍微消除主题/受众的差异,但同样,这似乎比它的价值更麻烦
不过,我很想看看更多Rails-y用户对这个问题的看法。将此添加到您的模型中
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
你只需要对听众和主题使用相同的参数键我发现这比简单的解决方案不那么明显,也更难理解(这就是为什么我在回答中只顺便提到了它)。看起来像MetaSearch、MetaWhere或Ransack之类的东西可以帮到你。谢谢Dave-基于我需要做的,我将创建单独的路线。我玩了一会儿,发现这是我最好的选择-谢谢你的输入@加文:没问题——有时候这是最干净、最容易维护的事情,不管是好是坏。