Вложенные атрибуты в представлении индекса? - PullRequest
0 голосов
/ 15 марта 2010

Кажется, я получаю сообщение об ошибке:

uninitialized constant Style::Pic

когда я пытаюсь отобразить вложенный объект в представлении индекса, представление представления в порядке.

class Style < ActiveRecord::Base
#belongs_to :users
has_many :style_images, :dependent => :destroy
accepts_nested_attributes_for :style_images,
 :reject_if => proc { |a| a.all? { |k, v| v.blank?} } #found this here http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes

has_one :cover, :class_name => "Pic", :order => "updated_at DESC"
accepts_nested_attributes_for :cover
end


class StyleImage < ActiveRecord::Base
belongs_to :style
#belongs_to :style_as_cover, :class_name => "Style", :foreign_key => "style_id"
has_attached_file :pic, 
                  :styles => { :small => "200x0>", 
                               :normal => "600x> " }

validates_attachment_presence :pic
#validates_attachment_size :pic, :less_than => 5.megabytes

end



<% for style_image in @style.style_images %>
<li><%= style_image.caption %></li>


<div id="show_photo">


    <%= image_tag style_image.pic.url(:normal) %></div>

<% end %>

Как видно из вышеприведенного. Основной стиль модели имеет много style_images, все эти style_images отображаются в представлении show, но в представлении index я хочу показать одно изображение, которое было названо и будет действовать как обложка это отображается для каждого стиля.

в контроллере индекса я пробовал следующее:

class StylesController < ApplicationController
  layout "mini"
  def index
    @styles = Style.find(:all,
    :inculde => [:cover,]).reverse

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @styles }
    end
  end

и индекс

<% @styles.each do |style| %>


<%=image_tag style.cover.pic.url(:small) %>

<% end %>



class StyleImage < ActiveRecord::Base
belongs_to :style
#belongs_to :style_as_cover, :class_name => "Style", :foreign_key => "style_id"
has_attached_file :pic, 
                  :styles => { :small => "200x0>", 
                               :normal => "600x> " }

validates_attachment_presence :pic
#validates_attachment_size :pic, :less_than => 5.megabytes

end

В таблице style_images также есть cover_id.

Из примерно видно, что я включил крышку в контроллер и модель. Я знаю, где я ошибаюсь!

Если кто-то может помочь, пожалуйста, сделайте!

1 Ответ

0 голосов
/ 15 марта 2010

Вы должны исправить определение :cover ассоциации следующим образом.

has_one :cover, :class_name => "StyleImage", :order => "updated_at DESC"

Я вижу еще одну потенциальную проблему в вашем дизайне. У вас есть ассоциация has_many и has_one, указывающая на одну и ту же таблицу с использованием одного и того же внешнего ключа (style_id).

class Style < ActiveRecord::Base
  has_many :style_images
  has_one  :cover, :class_name => "StyleImage", :order => "updated_at DESC"
end

Для работы ассоциации :cover изображение обложки должно иметь максимальное время обновления в таблице style_images. Это не очень безопасное предположение. Вы можете улучшить это следующим образом:

Добавить новый столбец в таблицу style_images для хранения типа изображения. Теперь ваша ассоциация может быть переписана как:

has_one  :cover, :class_name => "StyleImage", :conditions => {:itype => "cover"}

OR

Измените ассоциацию has_one на belongs_to и сохраните внешний ключ (style_image_id) в таблице styles, т.е.

class Style < ActiveRecord::Base
  has_many :style_images
  belongs_to  :cover, :class_name => "StyleImage"
end
...