6

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

Odpowiedz

1

Problem był z reject_if w accepts_nested_attributes dla modelu post

accepts_nested_attributes_for :post_images, :reject_if => lambda { |t| t[:post_image].nil?}, :allow_destroy => true

komentując ją Naprawiono problem.

+0

Niezły. Dzięki kolego :) –

+0

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. –

Powiązane problemy