2015-12-25 66 views
0

我有一個問題:在一定值顯示問題軌

<% @post.each do |post| %> 
    <%=link_to post.title, post %> 
    <p>Published 
    <%= time_ago_in_words(post.created_at) %> ago by 
    <%= post.user.user_name %></p> 
<% end %> 

的用戶名不顯示它停留在網頁只是空白,而如果鍵入:

它運行電子郵件顯示。我不明白爲什麼user_name沒有顯示出來,對我來說沒有任何意義。如果您現在需要,我正在使用weBrick服務器進行開發。

+1

'user_name'場可能不會當你註冊時填寫的USER_NAME字段包含值 –

+0

它含有雖然 –

+0

和user_name是存儲在數據庫中 –

回答

1

這可能意味着您沒有user_name存在於關聯用戶字段中,但如果它完全缺失,它通常會拋出異常。

我想說的記錄是空白 NULL 分貝,因此它沒有任何實際價值,當你將它輸出。

解決問題的方法是確保將值存儲在數據庫中。 Rails有validations爲了這個目的:

#app/models/user.rb 
class User < ActiveRecord::Base 
    validates :user_name, presence: true 
end 

這將每次解僱你createupdate用戶記錄,這意味着當你在你的意見發送PARAMS像...

#<User id: 1, user_name: nil, full_name: nil, email: "[email protected]", password_digest: "$2a$10$wLxvI3RYjjIY2lmga0irU.Rlf0pwCM6/HlsgbI10eb1...", role: nil, created_at: "2015-12-25 09:39:37", updated_at: "2015-12-25 09:39:37"> 

.. 。它會返回一個錯誤,您不能創建該記錄,因爲user_name不存在。


在這樣的情況下,我們使用的方法來回落到電子郵件,如果name不存在:

#app/models/user.rb 
class User < ActiveRecord::Base 
    def user_name 
     self[:user_name] || email 
    end 
end 

這使您可以撥打@user.name,如果他們沒有它,它取而代之的是email

這樣,如果您驗證電子郵件存在,您將可以始終返回一個值。

-

另一個很酷的技巧是delegate,避免了law of demeter(IE只有調用屬性時,一個點):

#app/models/post.rb 
class Post < ActiveRecord::Base 
    delegate :user_name, to: :user 
end 

這將允許您撥打:

<%= post.user_name %> 

...它調用User模型的user_name屬性。