ruby-on-rails Rails错误消息:nil的未定义方法“persisted?”:NilClass

smdnsysy  于 2023-04-08  发布在  Ruby
关注(0)|答案(1)|浏览(118)

我刚刚添加了这行代码:<%= 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?,以为它可能是项目文件中的一行代码,这可能会给予我更好地了解这个错误消息向我发出的信号,但项目中没有这样的行。
不知道这是否相关,但该项目使用devise进行用户身份验证,并使用turbo-links进行即时页面重新加载(这不起作用,但也不会干扰显示)。
该项目在这里找到https://github.com/German-Cobian/Twitter-Rails,以防您需要更好地了解项目的设计。
任何帮助都非常感谢。

pn9klfpd

pn9klfpd1#

首先使用委托来删除违反得墨忒耳法则的行为:

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

相关问题