Rails: неинициализированная константа PostsController :: TextPost - PullRequest
2 голосов
/ 22 августа 2011

В моем приложении у меня есть разные посты, которые люди могут создавать. Итак, у меня была идея включить Single Table Inheritance для этого:

class Post < ActiveRecord::Base
  has_many :comments
end

class TextPostValidator < ActiveModel::Validator
  def validate(record)
    if record.title.nil? and record.body.nil?
      record.errors[:base] << "Either title or body is necessary"
    end
  end
end

class TextPost < Post
  validates_with TextPostValidator
end

class ImagePost < Post
  validates :image_url, :presence => true
end

class VideoPost < Post
  validates :video_code, :presence => true
  validates :video_service, :presence => true
end

class LinkPost < Post
  validates :link_url, :presence => true
end

И когда я сейчас сделаю это в моем PostsController:

def new_text
  @post = TextPost.new
end

def new_image
  @post = ImagePost.new
end

def new_video
  @post = VideoPost.new
end

def new_link
  @post = LinkPost.new
end

Я получаю эту ошибку:

uninitialized constant PostsController::TextPost

Кажется, я недостаточно знаю о внутренней работе Rails, чтобы понять, почему.

Добавление Из rails console:

irb(main):009:0* ActiveRecord::Base.subclasses
=> [Post(id: integer, title: string, body: text, video_service: string, video_code: string, image_url: string, link_url: string, ooc: boolean, nsfw: boolean, allow_comment: boolean, type: string, created_at: datetime, updated_at: datetime),
TextPost(id: integer, title: string, body: text, video_service: string, video_code: string, image_url: string, link_url: string, ooc: boolean, nsfw: boolean, allow_comment: boolean, type: string, created_at: datetime, updated_at: datetime),
ImagePost(id: integer, title: string, body: text, video_service: string, video_code: string, image_url: string, link_url: string, ooc: boolean, nsfw: boolean, allow_comment: boolean, type: string, created_at: datetime, updated_at: datetime),
VideoPost(id: integer, title: string, body: text, video_service: string, video_code: string, image_url: string, link_url: string, ooc: boolean, nsfw: boolean, allow_comment: boolean, type: string, created_at: datetime, updated_at: datetime)
LinkPost(id: integer, title: string, body: text, video_service: string, video_code: string, image_url: string, link_url: string, ooc: boolean, nsfw: boolean, allow_comment: boolean, type: string, created_at: datetime, updated_at: datetime)]

Кажется, хорошо.

Ответы [ 2 ]

5 голосов
/ 27 ноября 2011

Неинициализированная постоянная ошибка подпадает под Ошибка маршрутизации. Попробуйте перейти к файлу rout.rb и предложить как единичные, так и множественные ресурсы.

ресурсов: пост а также ресурсы: сообщения

0 голосов
/ 05 февраля 2013

От: http://www.hackido.com/2009/03/quick-tip-solve-uninitialized-constant.html

"Оказывается, среди основных изменений, которые произошли вместе с последним выпуском Ruby on Rails, было и несколько второстепенных. Одним из них является то, что контроллер приложений больше не называется application.rb Теперь он называется as application_controller.rb.

По сути, чтобы решить эту проблему, просто переименуйте файл. Или, как указывает Лиам в комментариях ниже, запустите: "

рейковые рейки: обновление

...