2017-06-14 1 views
0

Ich habe folgendes Modell:Warum verursacht dieser Code einen Fehler, wenn er innerhalb des Controllers verwendet wird, aber nicht die Ansicht?

class User 

include DataMapper::Resource 

property :id,  Serial 
property :name, String, required: true 
property :email, String, required: true, unique: true 
property :password_digest, Text 
attr_reader :password 
attr_accessor :password_confirmation 

validates_confirmation_of :password 
validates_format_of :email, as: :email_address 

has n, :victories 

Das funktioniert gut und ermöglicht Menschen auf die Website-up zu unterzeichnen. Allerdings habe ich definiert dann die folgende Route:

get 'users/all' do 
    @users = User.all 
    @users.each do |user| 
    user.name 
    end 
end 

Nun wird noch die Anwendung ausgeführt, aber wenn ich zu besuchen versuchen ‚/ Benutzer/alle‘, grüßte ich bin mit „Diese Seite kann nicht erreicht werden“ und die folgenden Terminalfehler:

ERROR Rack::Lint::LintError: Body yielded non-string value #<User @id=1 @name="Iain K" @email="[email protected]" @password_digest=<not loaded>> 

Wenn ich diese Logik in einem jedoch Ansicht wickeln, es funktioniert:

get 'users/all' do 
    @users = User.all 
    erb(:'users/all') 
end 

Innen Benutzer/all.erb:

<% @users.each do |user| %> 
<li> 
    Name: <%= user.name %> 
</li> 
<% end %> 

Warum ist das?

Alle Hilfe ist willkommen.

Danke.

Antwort

4

Am Ende des Tages muss Ihr Controller eine Zeichenfolge zurückgeben. erb :'users/all' gibt eine Zeichenfolge zurück.

Lassen Sie uns eine Sekunde sichern und wenn an Ihrem vorhandenen Code aussehen, speziell diese:

@users.each do |user| 
    user.name 
    end 

Der Block hier grundsätzlich keine Wirkung hat; each hat nicht eine modifizierte Array zurück (vielleicht waren Sie für map suchen?)

Obwohl Sie bereits die richtige Idee haben, diese Logik in den Blick zu bewegen, ich bin unter Hinweis darauf, nur, dass der ursprüngliche Code falsch war in mehr Wege als einer.

+0

Ich realisiere, dass ich '.each' falsch hier verwendet habe. Wenn ich "print user.name" sagen würde, wäre das in Ordnung, oder? (Ich sage nicht, dass es diesen besonderen Fehler gelöst hätte). Danke für deine Hilfe, Max. – IainK

+0

Ja, wenn Sie jede Zeile drucken wollten, die Sinn machen würde. Aber es ist nicht klar, was Sie im ursprünglichen Code versuchten. –

+0

Hey, nur eine späte Folgefrage: Warum muss ich "print" nicht angeben, wenn ich diese Logik in der Ansicht anwende? Danke noch einmal. – IainK

Verwandte Themen