2016-07-11 7 views
3

У меня есть частичный _errors.html.haml, чтобы отобразить ошибки формы в моем приложении. Код внутри частичный:Rails 4 рендер частично с местными

.errors 
    %ul 
    - errors.full_messages.each do |message| 
     %li= message 

Я рендеринг парциального от проектов/new.html.haml в

= render 'shared/errors', locals: { errors: @project.errors } if @project.errors.any? 

Ошибку частичные находится в views/shared каталоге.

Но я получаю сообщение об ошибке при попытке частичного отображения ошибок.

undefined local variable or method errors' for #<#<Class:0x0055895405bbc0> :0x00558951a80fe0>

Если изменить рендеринга линию

= render 'shared/errors', errors: @project.errors if @project.errors.any? 

это работает. Почему в этом случае не работает locals?

+0

Я ответил [вопрос] (http://stackoverflow.com/questions/38129112/rails-undefined-local-variable-or-method-page/38142541#38142541) имеет такую ​​же проблему. Вы можете проверить источник [render] (https://github.com/rails/rails/blob/8cb8ce98d903929342e2ca3a54a07ab5196baf93/actionview/lib/action_view/helpers/rendering_helper.rb#L26), чтобы понять, почему он не работает. – Thanh

ответ

2

Просто добавить на ответ Khánh в. Я экспериментировал со всеми вариантами. Похоже, что если вы хотите использовать термин locals для частичного рендеринга Rails, вам нужно указать ключевое слово partial.

Явная Так это будет работать

= render partial: 'shared/errors', locals: { errors: @project.errors } if @project.errors.any? 

неявной Или короткая форма будет

= render 'shared/errors', errors: @project.errors if @project.errors.any? 

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

0

Я думаю, что ваша проблема составляет условие для locals.

Вы можете попробовать сделать это:

- if @project.errors.any? 
    = render partial: 'shared/errors', locals: { errors: @project.errors } 

В _errors.html.haml

.errors 
    %ul 
    - test_errors.full_messages.each do |message| 
     %li= message