为什么我得到'nil'不是与ActiveModel兼容的对象。它必须实现:to_partial_path错误?

时间:2013-11-05 08:34:50

标签: ruby-on-rails polymorphism renderpartial

为什么我收到以下错误?

  

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

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

以下是型号代码:

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

6 个答案:

答案 0 :(得分:5)

将ActiveModel包含在纯Ruby对象

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

而不是:扩展ActiveModel :: Naming你希望包含ActiveModel :: Model - 更改Rails 4以便更容易使用普通对象。

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

For Thoughtbot learn subscribers there's a link to the discussion.强大的参数是这个优秀教程的另一个问题。

答案 1 :(得分:4)

您遇到的问题是因为您的数据库中存在没有与之关联的内容的现有记录。发生这种情况是因为您从非多态设置转变为多态设置。您需要做的是查找缺少content_type和content_id的呼叫,并将其从数据库中删除。删除后,添加

会很有用

validates_associated:content

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

答案 2 :(得分:1)

@shouts = current_user.shouts在此行@shouts设置为nil

检查current_user.shouts,它必须以nil

返回

修改
而是尝试这个

  

<%= render @shouts.content %>

答案 3 :(得分: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,对于其他任何寻找思维机器人教程修复程序的人来说。

答案 4 :(得分:0)

安装imagemagick将解决此问题。

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

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

答案 5 :(得分:0)

brew install imagemagick成功了。

即使清理了任何旧记录的数据库,我也遇到了类似的错误。 PhotoShout使用content_id: nil保存到数据库中,这显然是问题的根源。

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