Рефакторинг этого кода в Ruby - PullRequest
2 голосов
/ 08 апреля 2011

Есть ли элегантный способ сделать это в Ruby?

if params[:limit] && params[:limit].to_i < 50
  @limit = params[:limit].to_i
elsif params[:limit] && params[:limit].to_i > 50
  @limit = 50
end

Ответы [ 6 ]

3 голосов
/ 08 апреля 2011
@limit = [params[:limit].to_i, 50].min unless params[:limit].nil?
2 голосов
/ 08 апреля 2011

Как насчет этого?

if params[:limit]
  @limit = [params[:limit].to_i, 50].min
end

Кроме того, ваш текущий код может содержать ошибку в том, что он не устанавливает @limit, если params [: limit] = 50 (вы проверяете на> 50 и <50, но не = 50). </p>

Редактировать: реализация fl00r в комментарии философии почти такая же, но более краткая. Используйте его вместо этого.

2 голосов
/ 08 апреля 2011
limit = params[:limit] && params[:limit].to_i
@limit = limit && limit < 50 ? limit : 50

OR

@limit = params[:limit] && l=params[:limit].to_i && (l < 50 ? l : 50)

И я не знаю, хотите ли вы вернуть @limit как ноль в случае, если params[:limit] не существует? Потому что в обоих случаях @limit не будет инициализирован, как в вашем примере, если нет params[:limit]

1 голос
/ 08 апреля 2011
@limit = params[:limit] && [params[:limit].to_i, 50].min

Я думаю, что это наиболее показательный подход.

0 голосов
/ 08 апреля 2011
@limit = ((1..50).include? params[:limit]) || 50

(nil.to_i равно 0, поэтому проверять не нужно)

0 голосов
/ 08 апреля 2011

не совсем элегантно, но короче

@limit = params[:limit] ? (params[:limit].to_i < 50 ? params[:limit].to_i : 50 ) : nil

Я бы также рассмотрел использование атрибута модели с обратными вызовами ... не уверен, как, но это может сработать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...