0

私は2つのモデルを持っています:

 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 を写真に関連付けます。各記事には 2 つの写真フィールドがあり、それぞれに独自のタイプ (例: 小、大) があります。そのフィールドをレンダリングする方法と、タイプの異なる 2 つの写真を含む記事を保存するにはどうすればよいでしょうか。

4

1 に答える 1

0

1 の答え: を使用しvalidates_associated :photosます。ドキュメンテーション

2 の回答: 添付ファイル フィールドだと思います。cacheそのために、これは通常、隠しフィールドを設定し、いくつかのコールバックを使用して行われます。MountUploaderは同じ原則を使用します。

3 の答え: 少し懐疑的ですが、この方法で何かがうまくいくと思い
ます:Articleモデルでは、次のように 2 つの関連付けを行いPhotoます。

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

これにより、 のフォームを開いたときに、両方のタイプに 2 つのサブフォーム フィールドを表示できますArticle

それが役に立てば幸い。最後のものがこのようにあなたのために働くことができるかどうかコメントしてください. それは私には良い取引のように見えます:)

于 2013-04-28T20:55:30.737 に答える