2010-03-24 4 views
4

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

Heres' фиктивный код:

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

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

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

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

+0

Что делает этот фиктивный код? Вы просто убеждены, что это неправильно, или это на самом деле вызывает ошибку? Мне нравится, как он читается как естественный язык. – Ben

ответ

5

Простой:

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

Но лучше:

return render(:nothing => true) if params[:name].blank? 
12

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

4

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

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

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

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

def do_something 
    redirect_to(:action => "elsewhere") and return if monkeys.nil? 
    render :action => "overthere" # won't be called if monkeys is nil 
end 
1

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

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

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

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

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