Rails - перемещение логики контроллера в модель - PullRequest
2 голосов
/ 06 ноября 2011

Я хочу почистить мой контроллер, так как он кажется тяжелым и избыточным. Буду признателен за любую помощь в том, как я перенесу этот тип логики в мою модель. Спасибо за любую помощь в этом - код ниже мой для действий индекса:

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 ]

1 голос
/ 06 ноября 2011

Добавьте это к вашей модели

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 голос
/ 06 ноября 2011

Я не совсем уверен, что переместит его в модель.Я бы, вероятно, просто переместил его в метод приватной утилиты в контроллере.

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, чтобы немного подсушить разницу между темой и аудиторией, но, опять же, это кажется большим количеством проблем, чем оно того стоит.

IИнтересно будет узнать, что еще люди Rails думают по этому вопросу.

...