Les Rails ne va pas vous aider beaucoup à faire. Il va à l'encontre de la vue standard de conventions, de sorte que vous aurez à faire des solutions de contournement dans la vue, le contrôleur, même les routes. Ce n'est pas amusant.
La clé de ressources sur la façon de traiter avec multi-modèles de formulaires, les Rails de chemin sont Stephen Chu du params-foo de la série, ou si vous êtes sur des Rails 2.3, découvrez l'Objet Imbriqué Formes
Il devient beaucoup plus facile si vous définissez une sorte de unique ressource que vous modifiez, comme une session photo. Une session photo pourrait être un réel, ActiveRecord type de modèle ou peut-être juste une façade qui accepte les données et jette les erreurs, comme si c'était un ActiveRecord modèle.
Maintenant, vous pouvez écrire un formulaire de vue un peu comme ceci:
<% form_for :photoset do |f|%>
<% f.object.photos.each do |photo| %>
<% f.fields_for photo do |photo_form| %>
<%= photo_form.text_field :caption %>
<%= photo_form.label :caption %>
<%= photo_form.file_field :attached %>
<% end %>
<% end %>
<% end %>
Votre modèle doit valider chaque enfant de la Photo qui vient dans et de les agréger leurs erreurs. Vous voudrez peut-être consulter un bon article sur la façon d'inclure des Validations dans n'importe quelle classe. Il pourrait ressembler à quelque chose comme ceci:
class Photoset
include ActiveRecord::Validations
attr_accessor :photos
validate :all_photos_okay
def all_photos_okay
photos.each do |photo|
errors.add photo.errors unless photo.valid?
end
end
def save
photos.all?(&:save)
end
def photos=(incoming_data)
incoming_data.each do |incoming|
if incoming.respond_to? :attributes
@photos << incoming unless @photos.include? incoming
else
if incoming[:id]
target = @photos.select { |t| t.id == incoming[:id] }
end
if target
target.attributes = incoming
else
@photos << Photo.new incoming
end
end
end
end
def photos
# your photo-find logic here
@photos || Photo.find :all
end
end
En utilisant une façade modèle pour la session photo, vous pouvez garder votre contrôleur et vue logique, simple et directe, en se réservant le plus complexe de code pour un modèle dédié. Ce code ne sera probablement pas fonctionner hors de la boîte, mais j'espère qu'il va vous donner quelques idées et de vous diriger dans la bonne direction pour résoudre votre question.