我有两种模式:
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并将其与照片联系起来。每篇文章都有两个照片字段,每个字段都有自己的类型(例如:小,大)。我想知道如何渲染那些字段,我该怎么做才能用两张不同类型的照片来保存文章。
答案 0 :(得分:0)
回答1 :使用validates_associated :photos
。 Documentation
回答2 :我猜这是一个文件附件字段。为此,通常通过设置隐藏的cache
字段并使用一些回调来完成。 MountUploader使用相同的原则。
回答3 :很少持怀疑态度,但我想有些事情可以这样做:
在Article
模型中,与Photo
有两个关联:
has_one :small_photo, :class_name => "Photo"
has_one :big_photo, :class_name => "Photo"
这样,您可以在打开Article
表单时为两种类型提供两个子表单字段。
希望它有所帮助。如果最后一个可以通过这种方式为您工作,请发表评论。对我来说这看起来很划算:))