Почему я получаю 'nil' - это не ActiveModel-совместимый объект. Должно быть реализовано: ошибка to_partial_path?

Почему я получаю следующую ошибку?

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

6 ответов

Решение

Проблема в том, что в вашей базе данных есть записи, с которыми не связано содержимое. Это происходит потому, что вы перешли от неполиморфной настройки к полиморфной. Что вам нужно сделать, это найти крики, в которых отсутствуют content_type и content_id и удалить их из базы данных. После того, как они будут удалены, было бы полезно добавить

validates_associated: содержание

чтобы ваша модель Shout гарантировала, что данные в будущем не будут "портить" вашу базу данных.

Включение ActiveModel в простые объекты Ruby

У руководства Thoughtbot Intermediate в Rails 4 есть несколько сложностей, но одна проблема заключается в добавлении функциональности ActiveModel в простой объект Ruby. Я вижу это на видео 3-й недели около получасовой отметки, пока преподаватель (AKA Mr Halogenandtoast) извлекает объект временной шкалы.

Вместо того, чтобы: расширить ActiveModel::Naming, вы хотите включить ActiveModel:: Model - Rails 4, чтобы упростить работу с простыми объектами.

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

Для подписчиков Thoughtbot есть ссылка на обсуждение. Сильные параметры были другой проблемой для этого отличного урока.

Я нашел эту ошибку в моем журнале разработки, которая была проблемой все время. Я был очень смущен на некоторое время.

[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.

@shouts = current_user.shouts на этой линии ваш @shouts устанавливается как nil

проверить current_user.shoutsдолжно возвращаться как ноль

Редактировать:
вместо этого попробуйте это

<%= render @shouts.content %>

Установка imagemagick решит проблему.

Проверьте раздел требований в Readme

https://github.com/thoughtbot/paperclip https://github.com/thoughtbot/paperclip

brew install imagemagick сделал трюк.

У меня была похожая ошибка, даже после очистки базы данных от любых старых записей. PhotoShout был сохранен в базу данных с content_id: nil, который был явно источником проблемы.

Я очистил базу данных еще раз, побежал brew install imagemagick и фотографии начали успешно загружаться.

Другие вопросы по тегам