Rails 错误消息:nil:NilClass 的未定义方法"持久化?



我刚刚将这行代码:<%= 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>

在我添加那行代码之前,所有其余的信息(tweet、display_name、user_name和tweet的创建时间)都成功显示了。

我不知道这是什么意思。我用我的代码编辑器查找named_route = if model.persisted?,认为它可能是项目文件中的一行代码,这可能会给我一个更好的主意,关于这个错误消息是向我发出的信号,但是在项目中没有这样的行。

不知道这是否相关,但项目使用设计用户身份验证和涡轮链接立即页面重新加载(这是不工作,但没有干扰显示)。

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

感谢您的帮助。

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

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

然后将重复和复杂的内容从视图中移除到helper*:

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

相关内容

  • 没有找到相关文章

最新更新