Rails 错误消息:未定义的方法“持续存在?”对于零:NilClass

问题描述 投票:0回答:1

我刚刚添加了这行代码:

<%= image_tag tweet.user.avatar %>
到以下视图文件

<%= turbo_frame_tag dom_id(tweet) do %>  
  <div class="tweet py-3 px-2">
    <% if(Time.zone.now - tweet.created_at) > 1.day %>
      <%= image_tag tweet.user.avatar %>
      <p><%= tweet.user.display_name %>@<%= tweet.user.username %> . <%= tweet.created_at.strftime("%b %-d") %></p>
    <% else %>
      <%= image_tag tweet.user.avatar %>
      <p><%= tweet.user.display_name %>@<%= tweet.user.username %> . <%= time_ago_in_words(tweet.created_at) %></p>
    <% end %>
    <p class="mb-0"><%= tweet.body %></p>
  </div>
<% end %>

这行代码是为了显示一张通过ActiveStorage附加给用户的图片。我检查控制台,图像已成功加载:

=> #<ActiveStorage::Attached::One:0x000000010813cf50
 @name="avatar",
 @record=
  #<User id: 3, email: "rajdeep@gmail", created_at: "2023-03-30 08:29:06.001223000 +0000", updated_at: "2023-03-30 21:35:17.296341000 +0000", username: "rj_deep", display_name: "Raja Deep">>

但是,一旦显示加载的图像,我就会收到此消息:

ActionView::Template::Error (Can't resolve image into URL: undefined method `persisted?' for nil:NilClass
 | 
        named_route = if model.persisted?
                                ^^^^^^^^^^^):
4:     <%= image_tag tweet.user.avatar %>
5:       <p><%= tweet.user.display_name %>@<%= tweet.user.username %> . <%= tweet.created_at.strftime("%b %-d") %></p>
6:     <% else %>
7:       <%= image_tag tweet.user.avatar %>
8:       <p><%= tweet.user.display_name %>@<%= tweet.user.username %> . <%= time_ago_in_words(tweet.created_at) %></p>
9:     <% end %>
10:     <p class="mb-0"><%= tweet.body %></p>

在我添加那行代码之前,所有其他信息(推文、显示名称、用户名和推文的创建时间)都已成功显示。

我不知道这是指什么。我使用我的代码编辑器查找

named_route = if model.persisted?
认为它可能是项目文件之一中的一行代码,这可能会让我更好地了解此错误消息向我发出的信号,但没有项目中的这样一行。

不知道这是否相关,但该项目使用 devise 进行用户身份验证和 turbo-links 以立即重新加载页面(这不起作用,但也没有干扰显示)。

项目在这里

https://github.com/German-Cobian/Twitter-Rails
,如果你需要更好地了解项目的设计。

非常感谢任何帮助。

ruby-on-rails rails-activestorage
1个回答
0
投票

首先使用委托来消除违反 Demeter 法则的行为:

class Tweet < ApplicationRecord
  belongs_to :user
  delegate :avatar, 
           :display_name, 
           :username, 
           to: :user
end

然后将视图中的重复和复杂性移除到助手*中:

module TweetsHelper
  def tweet_tagline(t) 
    "#{t.display_name}@#{t.username} . #{tweet_timestamp(t.created_at)}"
  end

  def tweet_avatar(t, **options)
    image_tag t.avatar, **options if t.avatar
  end

  private

  def tweet_timestamp(t)
    if t.today?
      t.strftime("%b %-d")
    else
      time_ago_in_words(t)     
    end
  end
end

现在视图可以以最简单的方式吐出标记:

<%= turbo_frame_tag dom_id(tweet) do %>  
  <div class="tweet py-3 px-2">
    <%= tweet_avatar(tweet) %>
    <p><%= tweet_tagline(tweet) %></p>
    <p class="mb-0"><%= tweet.body %></p>
  </div>
<% end %>
© www.soinside.com 2019 - 2024. All rights reserved.