显示轨道中某些值的问题



我遇到了一个问题:

<% @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

这将在每次createupdate用户记录时触发,这意味着当你在评论中发送类似的参数时。。。

#<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_。

最新更新