Задача вроде бы простая, юзер может смотреть все статьи, может смотреть статьи определенного пользователя, и свои (включая черновики) Написал вот этот кошмар http://pastie.org/private/0ar0gaoafypfajge2bqtyg понятно что это страшный код и интересует как подобное можно "просушить".
> Задача вроде бы простая, юзер может смотреть все статьи, может > смотреть статьи определенного пользователя, и свои (включая черновики) > Написал вот этот кошмарhttp://pastie.org/private/0ar0gaoafypfajge2bqtyg > понятно что это страшный код и интересует как подобное можно > "просушить".
Ага... Попробуйте, а мы пока посмотрим,
что из этого выйдет...
def index
@articles = articles.paginate(:page => params[:page])
end
def show
@article = articles.active.by_slug(params[:slug])
end
protected
def articles
if params[:path]
Secion.find_by_path(params[:path].join('/')).articles.latest.active
elsif params[:user_id]
user = User.find(params[:user_id])
articles = user.articles
articles = articles.active unless user == current_user
articles
else
Article.none # ну или что Вы тут задумали
показывать
end
end
Если Article.none, то можно тупо сделать
class Article < AR::Base
named_scope :none, :limit => 0
end
> On 21 окт, 18:06, toxy <se...@rambler.ru> wrote:
>> Задача вроде бы простая, юзер может
>> смотреть все статьи, может
>> смотреть статьи определенного
>> пользователя, и свои (включая
>> черновики)
>> Написал вот этот кошмарhttp://pastie.org/private/0a >> r0gaoafypfajge2bqtyg
>> понятно что это страшный код и
>> интересует как подобное можно
>> "просушить".
>> On 21 окт, 18:06, toxy <se...@rambler.ru> wrote:
>>> Задача вроде бы простая, юзер может
>>> смотреть все статьи, может
>>> смотреть статьи определенного
>>> пользователя, и свои (включая
>>> черновики)
>>> Написал вот этот кошмарhttp://pastie.org/private/0a >>> r0gaoafypfajge2bqtyg
>>> понятно что это страшный код и
>>> интересует как подобное можно
>>> "просушить".
>> def index >> @articles = articles.paginate(:page => params[:page]) >> end
>> def show >> @article = articles.active.by_slug(params[:slug]) >> end
>> protected
>> def articles >> if params[:path] >> Secion.find_by_path(params[:path].join >> ('/')).articles.latest.active >> elsif params[:user_id] >> user = User.find(params[:user_id]) >> articles = user.articles >> articles = articles.active unless user == current_user >> articles >> else >> Article.none # ну или что Вы тут задумали >> показывать >> end >> end
> Да, так сильно лучше. Срочно надо из > этого сделать плагин.
Ну, это любители плагинов сами сделают.
Как я понял, основная некрасивость была в том, что анализ варианта происходил в двух местах: #model_scope и #find_articles. Здесь все локализовано в одном месте.
но наверно ето отличается от GOTO здесь ето централизованый подход.
Ещё в коментах ссылка на идею "exceptions should not be expected" тоесть в эксепшенах ловить только Losing a connection to your database. Running out of memory Some obscure IO/socket error то что ну никак неожидаеш
а ввод пользователя некоректный, ето ожидаемо и ненадо из етого эксепшн делать. Такая идея. интерестно просто как кто думает по етому поводу.
On 21 окт, 19:29, Max Lapshin <max.laps...@gmail.com> wrote:
> Ещё в коментах ссылка на идею "exceptions
> should not be expected"
> тоесть в эксепшенах ловить только
> Losing a connection to your database.
> Running out of memory
> Some obscure IO/socket error
> то что ну никак неожидаеш
> а ввод пользователя некоректный, ето
> ожидаемо и ненадо из етого
> эксепшн делать. Такая идея.
> интерестно просто как кто думает по
> етому поводу.
Не знаю как кто пишет программы, я
ожидаю корректный ввод. Я пишу
программы выполнять полезные
действия, а не развлекать пользователя
реакциями на его некорректный ввод,
поэтому лично у меня это действительно
исключительная ситуация.
В целом я с Максимом согласен, но с маленькой поправкой. Когда речь идет о вводе человека, сидящего с той стороны, стоит всё таки быть к нему человечнее и показывать ему _его_ ошибки. Так, например, если есть поле с телефоном, то следует проверить его на непустоту. Если же был селект с вариантами, но приехало пустое поле из-за ошибки яваскрипта, тут смело можно кидать исключение что бы не пытаться дальше с этим работать.
Есть, правда, ситуации другие, когда импортируется файл на гигабайты или поток. Там бывает нельзя бросать всё и начинать сначала из-за одной ошибки, но это уже другой разговор.
Короче, прежде всего надо проверять happy path, а от ошибок валидации вполне можно избавлять пользователя яваскриптом.