Rails - 将控制器逻辑移动到模型中

时间:2011-11-06 18:30:20

标签: 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 => 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

2 个答案:

答案 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

您只需要为受众和主题使用相同的参数键