рубин одной строкой "проверить значение и вернуть" - PullRequest
4 голосов
/ 24 марта 2010

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

Вот фиктивный код:

render :nothing => true and return if params[:name].nil?

Мое наивное исправление ссылается на фон моего языка программирования:

if params[:name].nil?
  render :nothing => true, :status => 404
  return
end

Есть ли более элегантный, более рубиновый способ? (точки с запятой не учитываются:)

Ответы [ 5 ]

12 голосов
/ 24 марта 2010

Поскольку в Ruby Operator Precedence , if имеет более низкий приоритет, чем and, это работает точно так же, как и при чтении, и на самом деле довольно часто встречается во многих кодах rails, которые я видел.

5 голосов
/ 24 марта 2010

Simple:

return render(:nothing => true) unless params[:name]

Но лучше:

return render(:nothing => true)  if params[:name].blank?
4 голосов
/ 24 марта 2010

Как сказал джамураа, «более элегантный, более рубиновый способ» - это «поддельный код». Я думаю, что добавление паренов в этом случае делает его более читабельным.

render(:nothing => true) and return if params[:name].nil?
1 голос
/ 02 июля 2014

Я вижу, что некоторые люди предлагают использовать "render xxx и return if ...", и я настоятельно рекомендую против этой практики.

API рендеринга и перенаправления не утверждают, что они всегда должны возвращать истинное значение. Я предпочитаю писать это, используя эту идиому:

(render 'xyz'; return) if condition?
(head :ok; return) unless record.invalid?

Вы можете найти обсуждение этого также на трекере ошибок Ruby: https://bugs.ruby -lang.org / Issues / 6201

0 голосов
/ 26 декабря 2012

Старый вопрос, но я подумала, что предоставлю небольшую справку о том, почему эта строка появится в случае, если кто-то еще столкнется с ней. Это не фальшивка вообще; важно включить «и возврат», чтобы предотвратить DoubleRenderError. Из ActionController :: Базовые документы:

Если вам нужно что-то перенаправить при условии, что-то добавьте «и вернитесь», чтобы остановить выполнение.

def do_something
  redirect_to(:action => "elsewhere") and return if monkeys.nil?
  render :action => "overthere" # won't be called if monkeys is nil
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...