2017-06-14 47 views
0

我有以下型號:爲什麼此代碼在控制器內部使用時會拋出錯誤,而不是視圖?

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 

這工作得很好,並允許人們登錄到網站。然而,我則定義了以下路線:現在

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

,應用程序將繼續運行,但是當我試圖訪問「/用戶/所有」,我與「該網站無法達到」迎接和以下終端錯誤:

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

當我在然而視圖包裹這樣的邏輯,它的工作原理:

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

內的用戶/ all.erb:

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

這是爲什麼?

所有幫助表示讚賞。

謝謝。

回答

4

在一天結束的時候,您的控制器必須返回一個字符串。 erb :'users/all'返回一個字符串。

讓備份秒,在現有的代碼看起來雖然,特別是這樣的:

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

這裏的塊基本沒有影響; each返回修改後的數組(也許你正在尋找map?)

雖然你已經有了這個邏輯移動到視圖正確的想法,我只是指出,原來的代碼是錯誤的比一個更多的方式。

+0

我意識到我用'.each'錯誤在這裏。如果我說'print user.name',那會很好,對嗎? (我不是說它會解決這個特定的錯誤)。感謝您的幫助,Max。 – IainK

+0

是的,如果你想打印每一行都有道理。但不清楚你在原始代碼中想做什麼。 –

+0

嘿,只是一個後期的後續問題:爲什麼我在視圖中應用這個邏輯時不需要指定'print'?再次感謝。 – IainK

相關問題