2015-07-10 1 views
0

Мой текущий ERB файл выглядит следующим образом (который работает отлично),Rails: `next` метод перестает работать после перемещения его на рельсы частичной - Invalid следующая ошибка

<div> 
    <% [1,2,3,4,5].each do |el| %> 
    <% next if (el == 1) %> 
    <span><%= el %></span> 
    <% end %> 
</div> 

После того как я стараюсь, чтобы реорганизовать код и используя рельсы партиалы, это выглядит следующим образом,

<div> 
    <% [1,2,3,4,5].each do |el| %> 
    <%= render partial: "element", locals: {el: el} %> 
    <% end %> 
</div> 

и моя частичная _element.html.erb есть,

<% next if (el == 1) %> 
<span><%= el %></span> 

Этот рефактор вызывает проблему SyntaxError (_element.html.erb:40: Invalid next)

Я не уверен, почему next перестает работать после перемещения его в частичное. Любое обходное решение было бы оценено.

Заранее благодарен!

+2

Я уверен, вы не должны использовать 'next' в частичной, так как это часть' .each' цикла. –

+2

сначала есть орфографическая ошибка 'loclas' должна быть' locals'. Во-вторых, вы можете сделать это '<% = render (partial: 'element', locals: {el: el}), если el == 1%>'.Проблема, с которой вы сталкиваетесь, заключается в том, что частичное не имеет никакого контекста для самого блока, метод визуализации просто вызывается для каждого 'el' по очереди. Представьте себе, хотите ли вы использовать эту часть в другом месте, и она не была в цикле. Как вы ожидаете, что это будет работать? – engineersmnky

+0

@engineersmnky - Спасибо за опечатку, исправил ее. И мое требование не так просто, как я упоминал выше. Я не могу показать весь свой код здесь, поэтому я попытался опубликовать аналогичную проблему с простыми строками кода. Но, пожалуйста, подумайте, что я использую это частичное как в местах, где цикл определен, так и частично полностью написан с условиями, поэтому ваше предлагаемое решение не работает для меня, хотя ваше намерение верно. Есть ли что-нибудь, что я могу сделать вместо «следующего» в моем примере выше? –

ответ

1

Ответ на текущей задаче:

Следующая нельзя использовать вне контекста блока и по уважительной причине. Как бы вы ожидать, что это работать

def some_method(s) 
    next unless s 
    s 
end 

Очевидно внутри блока может иметь смысл

[nil,2,3,nil,4].map {|n| some_method(n) } # sure kind of makes sense 
#but what happens when I call 
some_method(nil) 
#how would you like it to use the next call here 
#next what; there is no next; you have reached the end of the universe 

реализуемое Обход:

Поскольку вы достаточно установить на этой концепции и код в мой комментарий кажется вам неприемлемым. Вы можете попробовать это вместо:

<div> 
    <% [1,2,3,4,5].each do |el| %> 
     <%= render partial: "element", locals: {el: el} %> 
    <% end %> 
</div> 

частичная _element.html.erb

<%= content_tag(:span,el) unless el == 1 %> 

Вы можете заменить el == 1 для того, что когда-либо ваше фактическое состояние, но если условие истинно оно не будет оказывать калибровочный тег в противном случае он будет оказывать

<span>Whatever el is here</span> 

#content_tag Docs, потому что я считаю, это намного лучше, чем при использовании html_safe или raw, если вам действительно не нужно.

+0

engineermnky - Спасибо! Это звучит разумно. Я начал работать с 'if' вместо' next'. Я понимаю, что 'next' не может использоваться вне контекста блока и по уважительной причине. –

0

Помня о том, что частицы скомпилированы в методы в динамически генерируемом классе вида, вы можете получить желаемый эффект, заменив return вместо next. Это приведет к короткому замыканию рендеринга вашего частичного шаблона, и цикл продолжит следующий элемент перечисления.

Поэтому ваш частичный _element.html.erb прочтет:

<% return if (el == 1) %> <span><%= el %></span>

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

  • Нет связанных вопросов^_^