2013-10-25 2 views
1

Я изучаю Rails, создавая приложение для проекта колледжа, который в основном является копией SO. Рассмотрите следующие маршруты:DRY'ing up rails app с новым контроллером

resources :questions do 
    resources :answers 
    post :vote_up, :vote_down, :on => :member 
end 

resources :answers do 
    post :vote_up, :vote_down, :on => :member 
end 

Хотя это прекрасно работает, я уверен, что это не лучший способ это сделать. Я получил много дублированного кода между действиями vote_up и vote_down на обоих контроллерах. У моих спецификаций тоже много дублирования.

Я хотел бы знать, как я могу приблизиться к этому самым сухим способом. Думаю, нужен VotesController, но я играл с маршрутизацией и не получил практического решения. Все, что у меня есть, было большим URL-адресом, а не тем, что я действительно надеялся.

Не могли бы вы указать мне в правильном направлении?

+0

Я уверен, что мир и их собака реализуют клон SO, на данный момент, если вы хотите взять ту же основу и произвести что-то более интересное, что вы и ваши друзья можете запустить сайт, вы можете пойти для классического сайта Q & A (http://en.wikipedia.org/wiki/Q&A_website) в пресс-релизе Forum 2000/Conversatron. Это было довольно забавно, и никто, кажется, больше этого не делает ... – glenatron

+0

Спасибо за ваше предложение. В то время клон SO выглядел неплохо. Но это строго для конкретного класса, который я беру. К сожалению, я потратил много времени, чтобы изменить его сейчас. – DiegoM

ответ

0

Похоже, вы описываете vote_controller, который может голосовать в любом направлении, а не разбивать вверх и вниз на свои собственные контроллеры.

Вопрос о том, чтобы разделить голосование вверх и вниз на собственный контроллер, насколько они отличаются. Если бы у вас были контроллеры vote_up и vote_down, они должны были бы найти голоса голоса, на которые проголосовали, добавить новое голосование, а затем сохранить данные. Почти все было бы одинаково независимо от того, голосуете вы или нет. На самом деле, как я бы управлять голосов будет иметь vote типа немного, как это:

class Vote 
     attr_reader :direction, :user, :timestamp 
    end 

Таким образом, один тип голос может записать, является ли она вверх или вниз голосование, а также записи, которые сделали (так что, если кто-то троллинг, вы можете отменить всю свою работу в пути) и время голосования, которое всегда полезно.

Тогда при звонке vote_controller.up_vote вы создаёте новый объект Vote с положительным направлением, для vote_controller.down_vote создайте его с отрицательным выражением. Все остальное совершенно общие, поэтому все, что бы в контроллер голосования будет туманно, как это:

def vote(direction) 
    myVote = vote.new(direction, Request.userId, Time.now) 
    voteOnObject.votes.add(myVote) 
end 

def up_vote 
    vote(1) 
end 

def down_vote 
    vote(-1) 
end 

Вы заметите, что это не что иное, как рабочий код. Это отчасти потому, что я не хочу делать домашнее задание для вас, отчасти потому, что в последнее время я не делал много Ruby, поэтому я немного скрипучий. Главное здесь принцип.

Если вы хотите быть должным образом DRY, вы также разработали бы это таким образом, чтобы те же элементы управления голосованием могли быть прикреплены к вопросам, ответам, комментариям и т. Д. (Поэтому у них есть родительский объект данного типа/реализуя данный микс, чьи голоса они корректируют, а не влияют на объект голосования на уровне модели), не внося никаких изменений.

+0

Это, безусловно, выглядит как правильный путь. Поскольку я довольно новичок в рельсах, но рубин тоже, мне придется больше смотреть в миксины. – DiegoM

+0

Разделение голосов вверх и вниз на контроллеры тоже будет жизнеспособным вариантом? – DiegoM

+0

Mixins - это способ управления множественным наследованием. Вы можете обнаружить, что само голосование может быть смешением, которое вы могли бы включить в разные контроллеры для обеспечения одинаковой функциональности для всех из них, но имейте в виду, что это основная функциональность Ruby, а в текущей версии Rails, вероятно, есть элегантный способ обработки этого поскольку его нестандартный сценарий и люди, которые пишут Rails, - это _smart._ – glenatron

Смежные вопросы