Почему я получаю '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
и фотографии начали успешно загружаться.