0

我有两个模型:

 class Article < ActiveRecord::Base
  belongs_to :league
  has_many :photos, :dependent => :destroy

  attr_accessible :content, :lead,  :title, :title_slug,
   :created_at, :updated_at, 
   :league_id, :photos_attributes

  accepts_nested_attributes_for :photos

  validates :content, :league, :presence => true
  validates :lead , :length => {maximum: 1000}, :presence => true
  validates :title ,:length => {maximum: 200}, :presence => true

  validates_associated :photos

class Photo < ActiveRecord::Base
  belongs_to :article

  attr_accessible :photo 

  validates :photo, presence: true

  has_attached_file :photo , :styles => { :medium => '440x312#', :small => '209x105!'}
end

我的 ArticlesController 是

...
  def new
    @article = Article.new
    @article.photos.build
  end

  def create
    @article = Article.new(params[:article])
    if @article.save
      redirect_to([:admin,@article])
    else
      render 'new'
    end

  end
...

表单视图是:

= form_for([:admin,@article] , :html => {:multipart => true}) do |f|
  - if @article.errors.any?
    = render 'errors'

  = f.fields_for :photos do |builder|
    = builder.label :photo
    = builder.file_field :photo

...

我对此有一些疑问:

1)我不想保存没有空照片的文章,但现在当我不选择文件时,我的文章会保存。

2)当我在文章的字段上出现一些错误并呈现“新”时,我的照片字段消失了,解决它的 Rails 方法是什么。

3)将来我想添加另一个模型:photo_type并将其与照片相关联。每篇文章将有两个照片字段,每个字段都有自己的类型(例如:小、大)。我想知道如何渲染该字段以及如何保存带有两张不同类型照片的文章。

4

1 回答 1

0

1 的答案:使用validates_associated :photos文档

2 的答案:我猜这是一个文件附件字段。为此,这通常是通过设置隐藏cache字段和使用一些回调来完成的。MountUploader使用相同的原理。

回答 3:有点怀疑,但我想这样会起作用:
在您的Article模型中,与 as 有两个关联Photo

has_one :small_photo, :class_name => "Photo"
has_one :big_photo,   :class_name => "Photo"

这将使您能够在为Article.

希望能帮助到你。如果最后一个可以以这种方式为您工作,请发表评论。对我来说这看起来很划算:)

于 2013-04-28T20:55:30.737 回答