2010-06-04 32 views
0

我在視圖以下:如何在模型中查看範圍或方法中的邏輯?

  <% unless contact_email.statuses.empty?%> 
       (<%= contact_email.statuses.find(:last).status%>) 
      <% end %> 

CONTACT_EMAIL是一個特定的模式的一個實例。

我可以這樣做嗎?

class ContactEmail < ActiveRecord::Base 
    attr_accessible :contact_id, :email_id, :status, :subject, :body, :date_created, :date_sent 

    def status 
    unless contact_email.statuses.empty? 
     contact_email.statuses.find(:last).status 
    end 
    end 

end 

有沒有更好的方法來做到這一點?有沒有辦法使用||運營商爲默認如果是空的?

基本上,我想能夠做到在查看以下內容:

<%= contact_email.status =>

,如果有一個值,然後顯示它,如果沒有,顯示沒有。

回答

1

我會改變這個

def status 
    unless contact_email.statuses.empty? 
    contact_email.statuses.find(:last).status 
    end 
end 

def status 
    return if statuses.empty? 
    statuses.find(:last).status 
end 

這應該使方法更清晰,更容易理解。

現在,在你看來,你可以打電話,只要你想

<%= contact_email.status => 
+0

也是如此返回如果statuses.empty?是否意味着它返回狀態方法如果是空的? – Angela 2010-06-06 05:41:16

+0

是的,如果'statuses.empty?'則狀態方法將返回nil否則它將返回最後一個狀態,它是方法中的最後一個語句 – nas 2010-06-06 06:00:40

0

您可以直接使用以下

<%= contact_email.statuses.find(:last).status unless contact_email.statuses.empty? %> 

OR

#I change methodname as it looks more meaningful 
def last_status 
    (self.statuses.empty?)? "defalut string if you want" : self.statuses.find(:last).status 
end 

,並調用它在你看來像

<%= contact_email.last_status %> 
+0

我覺得她是問她是否可以把它的模式,因爲在視圖中做它看起來髒髒的,不遵循MVC – corroded 2010-06-04 05:41:20

0

我不知道你在問什麼。通過檢查,看起來你在這裏發佈的代碼會做你想做的,但你不能只是運行它並找出?我們沒有完整的代碼庫或模式,但是您(希望)會這樣做:P

<%= x %>輸出的值爲x.to_s,而nil.to_s是空字符串。上面定義的ContactEmail#status方法返回最後一個狀態,否則返回nil。所以,是的,你寫的會做你想做的。

如果你想提供一個默認的狀態如果沒有一個,怎麼樣(模型):

def last_status 
    unless contact_email.statuses.empty? 
    contact_email.statuses.find(:last).status 
    end 
end 

def status 
    last_status || DEFAULT_STATUS 
end 

DEFAULT_STATUS = "Hello world!"