2016-08-28 4 views
0

Ich versuche eine Blogging-App zu erstellen und verwende Trix-Texteditor und CarrierWave.So verknüpfen Sie Rails-Modelle, bevor eines gespeichert wurde

Trip-Editor können Sie Bilder in den Textbereich ziehen, und ich habe es geschafft, arbeiten Bild-Uploads zu erhalten, indem Bilder auf ihre eigenen BlogImages Controller und das Modell mit dem folgenden Code veröffentlichen:

#blog_images_controller.rb: 

def create 
    @image = BlogImage.create(image_params) 
    @image.image = params[:image] 

    respond_to do |format| 
    if @image.save 
     format.json { render :json => { url: @image.image.url } } 
    end 
    end 
end 

private 
def image_params 
    params.require(:image).permit(:image) 
end 

#blog_images.coffee: 

(-> 
    host = undefined 
    uploadAttachment = undefined 
    document.addEventListener 'trix-attachment-add', (event) -> 
    attachment = undefined 
    attachment = event.attachment 
    if attachment.file 
     return uploadAttachment(attachment) 
    return 
    host = '/blog_images' 

    uploadAttachment = (attachment) -> 
    file = undefined 
    form = undefined 
    xhr = undefined 
    file = attachment.file 
    form = new FormData 
    form.append 'Content-Type', file.type 
    form.append 'image[image]', file 
    xhr = new XMLHttpRequest 
    xhr.open 'POST', host, true 

    xhr.upload.onprogress = (event) -> 
     progress = undefined 
     progress = event.loaded/event.total * 100 
     attachment.setUploadProgress progress 

    xhr.onload = -> 
     href = undefined 
     url = undefined 
     url = href = JSON.parse(@responseText).url 
     attachment.setAttributes 
     url: url 
     href: href 

    xhr.send form 

    return 
).call this 

Mein Problem ist jetzt ist, dass ich ein gespeichertes BlogImage habe, aber das Blog, dem sie zugeordnet werden müssen, ist noch nicht erstellt worden, also kann ich diese Verbindung nicht einstellen. Ich bin ziemlich neu in Rails, also wäre jede Anleitung großartig.

+1

Sie sollten einen Blick auf verschachtelte Formen annehmen: http://guides.rubyonrails.org/form_helpers. html # nested-forms Sie sollten keine verknüpften Modelle erstellen, bevor das Hauptmodell gespeichert wird. Was passiert, wenn jemand ein Dutzend Bilder hochlädt und das Blog-Formular nicht einreicht? Sie werden mit Junk-Image-Modellen verlassen. –

Antwort

1

Wahrscheinlich möchten Sie den Blog gleichzeitig mit seinen BlogImages speichern, indem Sie verschachtelte Attribute verwenden. Sie müssen sicherstellen, dass die Verknüpfungen zwischen den beiden Modellen in jedem Modell (Blog und BlogImage) korrekt eingerichtet sind.

in Ihrem Blog Modell:

has_many :blog_images

in Ihrem BlogImage Modell:

belongs_to :blog

hinzufügen accepts_nested_attributes_for :blog_images im Blog Modell

Ihre starke Parameter des BlogController Ändern Sie die akzeptieren verschachtelt att ributes, etwa wie folgt:

def params 
    params.require(:blog).permit(:title, :body, :published_on, blog_images_attributes: [:image_url, :another_image_attribute]) 
end 

Dann, wenn Sie Ihre Blog-Datensatz speichern, werden alle innerhalb verschachtelt BlogImages werden auch zugeordnet und gespeichert werden.

Es gibt eine Reihe von Teilen dieses Prozesses, also würde ich ein Tutorial wie check this out: http://tutorials.pluralsight.com/ruby-ruby-on-rails/ruby-on-rails-nested-attributes

Verwandte Themen