我刚刚添加了这行代码:
<%= 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
,如果你需要更好地了解项目的设计。
非常感谢任何帮助。
首先使用委托来消除违反 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 %>