我遇到了一个问题:
<% @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 %>
用户名不显示,它在网页中保持空白,而如果我键入:
<%= post.user.email%>
它工作的电子邮件显示。我不明白为什么user_name
没有出现,对我来说这毫无意义。如果你现在需要的话,我正在使用weBrick服务器进行开发。
这可能意味着关联用户字段中没有user_name
,尽管如果它完全缺失,通常会引发异常。
我认为该记录在数据库中是空白或NULL,因此在输出时没有实际值。
解决方法是确保将值存储在数据库中。Rails具有用于此目的的validations
:
#app/models/user.rb
class User < ActiveRecord::Base
validates :user_name, presence: true
end
这将在每次create
或update
用户记录时触发,这意味着当你在评论中发送类似的参数时。。。
#<User id: 1, user_name: nil, full_name: nil, email: "mateo@email.com", 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">
它将返回一个错误,即由于CCD_ 6不存在而无法创建记录。
在这种情况下,如果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 %>
其中它调用来自CCD_ 13模型的CCD_。