Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Rails—将控制器逻辑移动到模型中_Ruby On Rails 3_Model_Controller_Logic - Fatal编程技术网

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-基于我需要做的,我将创建单独的路线。我玩了一会儿,发现这是我最好的选择-谢谢你的输入@加文:没问题——有时候这是最干净、最容易维护的事情,不管是好是坏。