2016-08-28 4 views
0

Я пытаюсь создать приложение для блогов, и я использую текстовый редактор trix и CarrierWave.Как связать модели Rails перед сохранением

редактор Trip позволяет перетаскивать изображения в текстовую область, и я сумел получить загрузку изображений работает путем размещения изображений в их собственном контроллере BlogImages и модели, используя следующий код:

#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 

Моя проблема сейчас что у меня есть сохраненный BlogImage, но блог, к которому они должны быть привязаны, еще не создан, поэтому я не могу установить эту связь. Я совершенно новый для Rails, поэтому любое руководство будет замечательным.

+1

Вы должны взглянуть на вложенные формы: http://guides.rubyonrails.org/form_helpers. html # вложенные формы Вы не должны создавать связанные модели до того, как основной будет сохранен. Что произойдет, если кто-то загрузит дюжину изображений и не решит отправить бланк? У вас останутся модели нежелательных изображений. –

ответ

1

Возможно, вы захотите сохранить блог одновременно с его BlogImages, используя вложенные атрибуты. Вы должны убедиться, что ассоциации между двумя моделями настроены правильно в каждой модели (Blog и BlogImage).

в вашей Blog модели:

has_many :blog_images

в вашей BlogImage модели:

belongs_to :blog

Добавить accepts_nested_attributes_for :blog_images в модели Блог

Изменить сильные параметры вашего BlogController, чтобы принять вложенный аттестат ributes, что-то вроде этого:

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

Затем, когда вы сохраняете запись в блоге, все BlogImages вложенные в будут связаны и сохранены, а также.

Есть несколько частей к этому процессу, так что я бы проверить учебник вроде этого: http://tutorials.pluralsight.com/ruby-ruby-on-rails/ruby-on-rails-nested-attributes