2016-11-03 35 views
1
<p> 
    <strong>Dob:</strong> 
    <%= @student.dob %> 
    <%= today = Date.today%> 
    <%= d = Date.new(today.year, @student.dob.month, @student.dob.day)%> 
    <%= age = d.year - @student.dob.year - (d > today ? 1 : 0)%> 
    <strong>Age:</strong> 
    <%=age%> 
</p> 

所以這段代碼成功地取出了學生的出生日期並顯示了年齡。但是,當查看網頁時,它會顯示所有的計算結果。我如何得到它,只是顯示年齡?Ruby on Rails:我在我的節目中有計算年齡的代碼,但它顯示了所有計算。我如何得到它,只是顯示年齡?

回答

3

試試這個:

<p> 
    <strong>Dob:</strong> 
    <%= @student.dob %> 
    <% today = Date.today%> 
    <% d = Date.new(today.year, @student.dob.month, @student.dob.day)%> 
    <% age = d.year - @student.dob.year - (d > today ? 1 : 0)%> 
    <strong>Age:</strong> 
    <%= age %> 
</p> 

的問題是,您使用的等號(=)在您的ERB模板包含的變量賦值和計算,這將打印行的開頭將評估過的Ruby代碼的結果添加到您的模板中。

請記住,雖然這種邏輯不應該在你看來。視圖僅用於呈現填充了由您的型號提供的信息的html標記。在這種情況下,我認爲這將是好了很多,有這樣的邏輯在你的學生模型,就像這樣:

def age 
    d = Date.new(Date.today.year, dob.month, dob.day) 
    d.year - dob.year - (d > Date.today ? 1 : 0) 
end 

然後,你的看法是這樣的:

<p> 
    <strong>Dob:</strong> 
    <%= @student.dob %> 
    <strong>Age:</strong> 
    <%= @student.age %> 
</p> 

我希望它有幫助

+0

你也可以把這個邏輯轉換成一個幫手。 – mysmallidea

+0

@mysmallidea你可以,但是因爲它代表了一個可以在html模板之外使用的域邏輯(例如api),我認爲它應該在模型中 –

+0

嚴格地說,它是每行開頭的等號是問題。你的例子在每一行上都有相同的結果。挑剔,我知道.... – mjs