2016-07-11 47 views
3

Ich habe eine teilweise _errors.html.haml, um die Formularfehler in meiner Anwendung anzuzeigen. Der Code innerhalb des Teils:Schienen 4 render teilweise mit Einheimischen

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

Ich bin Rendering die teilweise von Projekten/new.html.haml als

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

Den Fehler teilweise besteht in views/shared Verzeichnis.

Aber ich bekomme einen Fehler, wenn ich versuche, die Fehler teilweise zu rendern.

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

Wenn ich die Rendering-Linie

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

es funktioniert zu

ändern. Warum funktioniert in diesem Fall nicht locals?

+0

Ich antwortete [eine Frage] (http://stackoverflow.com/questions/38129112/rails-undefined-local-variable-or-method-page/38142541#38142541) hat das gleiche Problem. Sie können die Quelle von [render] (https://github.com/rails/rails/blob/8cb8ce98d903929342e2ca3a54a07ab5196baf93/actionview/lib/action_view/helpers/rendering_helper.rb#L26) überprüfen, um zu sehen, warum es nicht funktioniert. – Thanh

Antwort

2

einfach auf Khanh Antwort hinzuzufügen. Ich habe alle Variationen experimentiert. Wenn Sie den Begriff locals für das partielle Rendering von Rails verwenden möchten, müssen Sie das Schlüsselwort partial angeben.

Explicit So würde das funktionieren

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

Implizite oder die Kurzform

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

Also abschließend wäre, wenn Sie die Raute-Taste für das Rendern teilweise angeben, werden alle seine Schlüssel muss explizit angegeben werden. Sonst müssten Sie den Hash-Schlüssel nicht angeben und Rails implizit basierend auf der Position herausfinden.

0

Ich vermute, dass Ihr Problem die Bedingung für locals macht.

können Sie versuchen, dies zu tun:

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

In _errors.html.haml

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