索引视图中的嵌套属性?

时间:2010-03-15 14:22:48

标签: ruby-on-rails ruby nested-attributes

我似乎得到了错误:

uninitialized constant Style::Pic

当我尝试将嵌套对象渲染到索引视图中时,show视图很好。

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视图中,但是在索引视图中我希望显示一个已经命名的图像并将作为封面为每种风格显示。

在索引控制器中我尝试了以下内容:

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 :(得分:0)

您必须按如下方式修复: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"}

has_one关联更改为belongs_to并将外键(style_image_id)存储在styles表中,即

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