Привести контроллер в порядок

2 views
Skip to first unread message

toxy

unread,
Oct 21, 2009, 11:06:52 AM10/21/09
to RubyOnRails to russian
Задача вроде бы простая, юзер может смотреть все статьи, может
смотреть статьи определенного пользователя, и свои (включая черновики)
Написал вот этот кошмар http://pastie.org/private/0ar0gaoafypfajge2bqtyg
понятно что это страшный код и интересует как подобное можно
"просушить".

Max Lapshin

unread,
Oct 21, 2009, 11:10:03 AM10/21/09
to ror...@googlegroups.com
А чем тебе этот код не нравится?

Pasha

unread,
Oct 21, 2009, 11:47:17 AM10/21/09
to RubyOnRails to russian
попробуйте эти плагины
http://github.com/josevalim/inherited_resources
и
http://github.com/stffn/declarative_authorization
или
http://github.com/be9/acl9

On 21 окт, 18:06, toxy <se...@rambler.ru> wrote:
> Задача вроде бы простая, юзер может смотреть все статьи, может
> смотреть статьи определенного пользователя, и свои (включая черновики)

> Написал вот этот кошмарhttp://pastie.org/private/0ar0gaoafypfajge2bqtyg

Maxim Kulkin

unread,
Oct 21, 2009, 12:03:33 PM10/21/09
to ror...@googlegroups.com
Ага... Попробуйте, а мы пока посмотрим,
что из этого выйдет...

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

Maxim Kulkin

unread,
Oct 21, 2009, 12:12:47 PM10/21/09
to ror...@googlegroups.com
Кстати, #create я обычно пишу так (может и
Вам понравится):

rescue_from ActiveRecord::RecordInvalid, :with =>
handle_validation_error

def create
article = current_user.articles.create!(params[:article])
flash[:notice] = "..."
respond_to do |format|
format.html { redirect_to root_path }
end
end

private

def handle_validation_error(e)
@article = e.record
respond_to do |format|
format.html { render :action => (@article.new_record? ? 'new' :
'edit') }
end
end

Max Lapshin

unread,
Oct 21, 2009, 12:29:35 PM10/21/09
to ror...@googlegroups.com
2009/10/21 Maxim Kulkin <maxim....@gmail.com>:

>
> 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
>

Да, так сильно лучше. Срочно надо из этого сделать плагин.

Maxim Kulkin

unread,
Oct 21, 2009, 12:38:25 PM10/21/09
to ror...@googlegroups.com

Ну, это любители плагинов сами сделают.

Как я понял, основная некрасивость
была в том, что анализ варианта
происходил в двух местах: #model_scope и
#find_articles. Здесь все локализовано в
одном месте.

faust45

unread,
Nov 7, 2009, 5:43:12 AM11/7/09
to RubyOnRails to russian
http://www.fngtps.com/2007/10/effectively-using-rescue_from
вот тут чуваки раскритиковали такой подход
говорят ето сильно похоже на GOTO усложняет чтение кода.

но наверно ето отличается от 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:
> 2009/10/21 Maxim Kulkin <maxim.kul...@gmail.com>:

Maxim Kulkin

unread,
Nov 8, 2009, 5:19:12 AM11/8/09
to ror...@googlegroups.com
On 07.11.2009, at 13:43, faust45 wrote:
> Ещё в коментах ссылка на идею "exceptions
> should not be expected"
> тоесть в эксепшенах ловить только
> Losing a connection to your database.
> Running out of memory
> Some obscure IO/socket error
> то что ну никак неожидаеш
>
> а ввод пользователя некоректный, ето
> ожидаемо и ненадо из етого
> эксепшн делать. Такая идея.
> интерестно просто как кто думает по
> етому поводу.

Не знаю как кто пишет программы, я
ожидаю корректный ввод. Я пишу
программы выполнять полезные
действия, а не развлекать пользователя
реакциями на его некорректный ввод,
поэтому лично у меня это действительно
исключительная ситуация.

Max Lapshin

unread,
Nov 8, 2009, 7:16:49 AM11/8/09
to ror...@googlegroups.com
В целом я с Максимом согласен, но с маленькой поправкой.
Когда речь идет о вводе человека, сидящего с той стороны, стоит всё
таки быть к нему человечнее
и показывать ему _его_ ошибки. Так, например, если есть поле с
телефоном, то следует проверить его на
непустоту. Если же был селект с вариантами, но приехало пустое поле
из-за ошибки яваскрипта,
тут смело можно кидать исключение что бы не пытаться дальше с этим работать.

Есть, правда, ситуации другие, когда импортируется файл на гигабайты
или поток. Там бывает нельзя
бросать всё и начинать сначала из-за одной ошибки, но это уже другой разговор.

Короче, прежде всего надо проверять happy path, а от ошибок валидации
вполне можно избавлять
пользователя яваскриптом.

Reply all
Reply to author
Forward
0 new messages