8

为什么我会收到以下错误?

nil不是 ActiveModel 兼容的对象。它必须实现 :to_partial_path。

我认为该错误可能与我正在使用 Rails 3.2 而我使用 Rails 4 的教程有关。

这是模型代码:

class DashboardsController < ApplicationController
  def show
    @text_shout = TextShout.new
    @photo_shout = PhotoShout.new
    @shouts = current_user.shouts
  end
end

class PhotoShoutsController < ApplicationController
  def create
    content = build_content
    shout = current_user.shouts.build(content: content)
    if shout.save
      redirect_to dashboard_path
    else
      flash.alert = "Could not shout."
      redirect_to dashboard_path
    end
  end

  private
  def build_content
    PhotoShout.new(photo_shout_parameters)
  end

  def photo_shout_parameters
    params.require(:photo_shout).permit(:image)
  end
end

这是 _shout.html 部分发生错误的视图代码

# app/view/dashboards/show.html.erb
<%= form_for @text_shout do |form| %>
   <%= form.text_field :body, placeholder: 'Shout content here' %>
   <%= form.submit 'Shout' %>
<% end %>

<%= form_for @photo_shout do |form| %>
   <%= form.file_field :image %>
   <%= form.submit 'Shout' %>
<% end %>

<%= render @shouts %>

# app/view/shouts/_shout.html.erb
<%= div_for shout do %>
  <%= link_to shout.user.username, shout.user %>
  shouted
                                 +---------------------------------+
  <%= render shout.content %> <--| ERROR "nil' is not an Active "  |
                                 | "Model-compatible object"       |
                                 +---------------------------------+
  <%= link_to time_ago_in_words(shout.created_at), shout %>
<% end %>

# app/views/photo_shouts/_photo_shout.html.erb
<%= image_tag photo_shout.image.url(:shout) %>
4

6 回答 6

5

将 ActiveModel 包含到普通的 Ruby 对象中

Rails 4 中的 Thoughtbot 中级教程几乎没有复杂性,但是,将 ActiveModel 功能添加到普通的 Ruby 对象中出现了一个问题。我在第 3 周的视频中看到这一点,大约半小时左右,而导师(又名 Halogenandtoast 先生)正在提取时间线对象。

而不是:扩展 ActiveModel::Naming 您想要包含 ActiveModel::Model - Rails 4 更改以更轻松地处理普通对象。

class Timeline
  include ActiveModel::Model
...
...

对于 Thoughtbot 学习订阅者,有一个讨论链接。强参数是这个优秀教程的另一个问题。

于 2013-11-30T14:40:54.987 回答
4

您遇到的问题是因为您的数据库中有现有记录,但没有与之关联的内容。发生这种情况是因为您从非多态设置变为多态设置。您需要做的是查找缺少 content_type 和 content_id 的呼喊并将它们从数据库中删除。删除这些后,添加可能会很有用

验证关联:内容

到您的 Shout 模型,以确保将来的数据不会最终“破坏”您的数据库。

于 2013-11-05T18:54:23.867 回答
1

@shouts = current_user.shouts在这条线上你@shouts设置为nil

检查current_user.shouts,它必须返回为 nil

编辑
改为试试这个

<%= render @shouts.content %>

于 2013-11-05T09:01:17.277 回答
1

我在开发日志中发现了这个错误,这一直是问题所在。我超级困惑了一会儿。

[paperclip] An error was received while processing <Paperclip::Errors::CommandNotFoundError: Could not run the `identify` command. Please install ImageMagick.>

看起来修复只是为了运行brew update(可选),并且brew install imagemagick对于其他正在寻找 thinkbot 教程修复的人来说。

于 2014-08-08T22:21:07.467 回答
0

安装 imagemagick 将解决这个问题。

检查自述文件中的要求部分

https://github.com/thoughtbot/paperclip#requirements https://github.com/thoughtbot/paperclip#image-processor

于 2015-04-24T06:52:31.603 回答
0

brew install imagemagick成功了。

即使在清除了所有旧记录的数据库之后,我也遇到了类似的错误。PhotoShout 被保存到数据库中content_id: nil,这显然是问题的根源。

我再次清理了数据库,运行brew install imagemagick并且照片开始成功上传。

于 2016-05-14T04:24:49.310 回答