Podejrzewam, że problem leży w sposobie tworzenia polimorficznego atrybutu obrazu. Używam fields_for
w formularzu. W tym przypadku użytkownik może utworzyć post i dodać zdjęcie za pomocą spinacza, przechowując go przy pomocy S3. Używam polimorficzny modela "post_image":Konfiguracja Rails 3 + Model polimorficzny obrazu + Spinacz do papieru i Amazon S3, Brak błędów, ale nic nie przesłania
class PostImage < ActiveRecord::Base
belongs_to :imageable, :polymorphic => true
#.merge(PAPERCLIP_OPS)
has_attached_file :image, :styles => { :medium => "200x200>", :thumb => "50x50>" },
:storage => :s3,
:s3_credentials => "#{Rails.root}/config/s3.yml",
:path => "/:style/:id/:filename",
:bucket => "zounds-dev"
validates_attachment_presence :image
validates_attachment_size :image, :less_than => 5.megabytes
end
post Model:
class Post < ActiveRecord::Base
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
Nowy post forma:
=form_for(setup_post(@post,current_user), :html => { :multipart => true}) do |f|
%dl
=f.fields_for :post_images do |ff|
=ff.file_field :image
%dt.field=f.label :name
%dd.field=f.text_field :name
%dt.field=f.label :description
%dd.field=f.text_area :description
=f.fields_for :user do |u|
=render "user_fields", :f => u
=f.fields_for :assignments do |ff|
=ff.check_box :_destroy, {:checked => ff.object.persisted?}, '0','1'
=ff.label :_destroy, ff.object.group.name
=ff.hidden_field :group_id
.action=f.submit "Save Post"
setup_post
Metoda pomocnik używane w Poczcie form_for
: (materiał grupy nie ma znaczenia tutaj)
def setup_post(post, current_user)
groups = current_user.groups_as_owner + current_user.groups_as_member
(groups - post.groups).each do |group|
post.assignments.build(:group => group)
end
post.assignments.sort_by {|x| x.group.name }
post_image = post.post_images.build
post
end
kontroler postu:
def new
@user = User.find(params[:user_id])
# @post = @user.posts.build
@post = Post.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @post }
end
end
def create
@user = current_user
@post = @user.posts.build(params[:post])
.
.
.
end
Podejrzewam, że problemem jest to, że używam fields_for
dla atrybut post_image, ale przyjrzałem się wszystkiemu i nie mogę określić, jaki jest właściwy sposób implementacji polimorficznego atrybutu zagnieżdżonego obrazu.
Zrobiłem też konsolę amazon s3 o numerze s3sh
i chociaż nie mogłem załadować obrazu, ponieważ nie mogłem wymyślić, jak przekazać właściwą ścieżkę obrazu do funkcji open(), podłączyłem się do S3. Mój plik s3.yml
jest również poprawnie skonfigurowany.
Dzięki yall, Brian
Niezły. Dzięki kolego :) –
Na wszelki wypadek ktoś to przeczyta: Usuń tylko tę stronę: reject_if => lambda {| t | t [: post_image] .nil?} Możesz zostawić: allow_destroy => true, jeśli chcesz, aby rekord obrazu został usunięty. –