【问题标题】:Rails - moving controller logic into a modelRails - 将控制器逻辑移动到模型中
【发布时间】:2011-11-06 18:30:19
【问题描述】:

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

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

【问题讨论】:

  • 看起来像 MetaSearch、MetaWhere 或 Ransack 可以在这里为您提供帮助。

标签: ruby-on-rails-3 model controller logic


【解决方案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 人对这个问题的看法。

【讨论】:

  • 谢谢 Dave - 根据我需要做的,我将创建单独的路线。我玩了一会儿,发现这是我最好的选择 - 感谢您的意见!
  • @Gavin 没问题——有时这是最干净、最容易维护的事情,无论好坏。
【解决方案2】:

将此添加到您的模型中

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

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

【讨论】:

  • 我发现它比天真的解决方案更不明显且更难阅读(这就是为什么我只在回答中顺便提到它的原因)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
相关资源
最近更新 更多