validation和accepts_nested_attributes_for

时间:2013-04-28 20:49:53

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有两种模式:

 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)当我在文章的字段上出现一些错误并呈现“新”时,我的照片字段消失了,解决它的轨道方式是什么。

3)将来我想添加另一个模型:photo_type并将其与照片联系起来。每篇文章都有两个照片字段,每个字段都有自己的类型(例如:小,大)。我想知道如何渲染那些字段,我该怎么做才能用两张不同类型的照片来保存文章。

1 个答案:

答案 0 :(得分:0)

回答1 :使用validates_associated :photosDocumentation

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

回答3 :很少持怀疑态度,但我想有些事情可以这样做:
Article模型中,与Photo有两个关联:

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

这样,您可以在打开Article表单时为两种类型提供两个子表单字段。

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