У меня есть модель Post, в которой много Post_Images (полиморфных как: imageable). Я пытаюсь создать вложенную форму, в которой можно создавать сообщения, в том числе Post_Images, при одновременном назначении сообщения группам (есть групповая модель, в которой имеются сообщения:
Модели:
Почтовая модель
class Post < ActiveRecord::Base
# attr_accessible :name, :borrow, :price, :description, :user_id, :product_category_id, :post_image_ids, :group_ids, :post_images_attributes, :post_image
has_many :post_images, :as => :imageable, :dependent => :destroy
accepts_nested_attributes_for :post_images, :reject_if => lambda { |t| t[:post_image].nil?}, :allow_destroy => true
.
.
.
end
Модель PostImage (должна быть только Image, но я сделал это только что и не могу ее изменить):
class PostImage < ActiveRecord::Base
# attr_accessible :imageable_id, :imageable_type, :post_image_ids
belongs_to :imageable, :polymorphic => true
has_attached_file :image, :styles => { :small => "150x150>", :large => "320x240>" }
validates_attachment_presence :image
validates_attachment_size :image, :less_than => 5.megabytes
end
PostsController
def new
@user = User.find(params[:user_id])
@post = @user.posts.build
@assigment = Assignment.new
#allow up to 5 images to be uploaded
#5.times {@post.build_post_image}
post_image = @post.post_images.build
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @post }
end
end
def create
@user = User.find(params[:user_id])
params[:post][:group_ids] ||= []
@post = @user.posts.build(params[:post])
if @post.save
redirect_to @user
else
redirect_to new_user_post_path(current_user)
end
end
Разрушенная форма: (создает посты, а также добавляет их в группы)
=nested_form_for( [@user, @post], :remote => true) do |f|
=hidden_field_tag 'user_id', @user.id
=f.fields_for :post_images
=f.link_to_add "Add an image", :post_images
=f.label :name
=f.text_field :name
=f.label :borrow, "borrow?"
=f.check_box :borrow
=f.label :price
=f.text_field :price
=f.label :description
=f.text_area :description
%h2 choose which groups you want to post this item to
-@user.groups_as_owner.each do |group|
= label_tag "group_checkbox_#{group.id}", group.name
= check_box_tag("post[group_ids]", group.id, @user.groups_as_owner.include?(group), :id => "group_checkbox_#{group.id}")
-@user.groups_as_member.each do |group|
= label_tag "group_checkbox_#{group.id}", group.name
= check_box_tag("post[group_ids]", group.id, @user.groups_as_member.include?(group), :id => "group_checkbox_#{group.id}")
.action=f.submit "Save Post"
_post_image_fields частично
=f.label :post_image, "Image"
%br
=f.file_field :post_image
=f.link_to_remove "remove"
Я прокомментировал attr_accessible, потому что я получал WARNING: Can't mass-assign protected attributes
, и в поисках решения этой проблемы я столкнулся с кучей ресурсов, включая:
вложенная форма с полиморфными моделями
google group convo с предупреждением о массовом назначении
вложенные рельсы 2
Насколько мне известно, никто из них не решал мою проблему. Может быть, это из-за дополнительного аспекта, который у меня есть в форме - создание групповых заданий? Хотя мне кажется, что это проблема Param. Потому что я дошел до того, что форма будет работать ... с большим количеством attr_accessible, но будет сказано, что он не может массово назначить :post_image
, который я сделал доступным в PostImages и Posts ... поэтому я не был уверен, в чем проблема с этим.
наконец, ответ в этом посте? (Я не совсем понимаю):
ActiveRecord, has_many: through и полиморфные ассоциации
Дайте мне знать, если я должен предоставить больше информации, как-нибудь прояснить это. С праздником всех!