2016-12-28 8 views
0

У меня есть две модели с именем Post и Attachment. Я напрямую загружаю приложение в amazon s3 с помощью Fine-Uploader. После успешной загрузки на s3 я отправляю URL-адрес загруженного файла обратно на мой клиент в объекте JSON.У меня есть отношение Post и Attachment. Как создать вложение до создания сообщения

После того, как клиент получает URL-адрес s3, я отправляю запрос на отправку AJAX в конечную точку рельсов, где в идеале id нравится создавать вложение ПЕРЕД тем, что пользователь фактически отправляет @post для создания.

После создания @attachment я затем возвращаю идентификаторы @attachment обратно клиенту в формате JSON, чтобы, если/когда пользователь отправляет сообщение, я могу взять @ post.id и обновить идентификатор сообщения @attachment поле с идентификатором @post.

Это так, что если пользователь загружает вложения, но никогда не отправляет сообщение, у меня может быть задание, которое идет и удаляет все вложения, которые никогда не обновлялись с идентификатором сообщения.

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я пытаюсь создать вложение (Attachment.create()), создание записи возвращается.

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

Любая помощь, получающая эту работу, очень ценится.

[1] pry(main)> Attachment.create(description: 'ho ho ho', media_url: 'test.com') 
    (0.6ms) BEGIN 
    (0.8ms) ROLLBACK 
=> #<Attachment:0x007f96b8c547b0 
id: nil, 
post_id: nil, 
description: "ho ho ho", 
media_url: "test.com", 
created_at: nil, 
updated_at: nil> 

здесь все мои модели и миграции

class Post < ApplicationRecord 

    has_many :attachments, :dependent => :destroy 

end 

и

class Attachment < ApplicationRecord 

    belongs_to :post 

end 

миграциями выглядеть следующим образом

class CreatePosts < ActiveRecord::Migration[5.0] 
    def change 
    create_table :posts do |t| 
     t.references :categories 
     t.string  :title, unique: true 
     t.text  :body 
     t.text  :tags, array: true, default: [] 
     t.string  :slug, unique: true 
     t.string  :description 
     t.string  :status 
     t.boolean :private_post, default: true 

     t.timestamps 
    end 
    add_index :posts, :slug 
    add_index :posts, :title 
    end 
end 

и

class CreateAttachments < ActiveRecord::Migration[5.0] 
    def change 
    create_table :attachments do |t| 
     t.references :post 
     t.string :description 
     t.string :media_url 

     t.timestamps 
    end 
    end 

конец

+0

У вас есть проверки в режиме вложения? Показывать ошибки после создания с помощью команды «Attachment.create» (описание: «ho ho ho», media_url: «test.com»). Errors.full_messages' –

+0

'[2] pry (main)> Attachment.create (описание: 'ho ho ho ', media_url:' test.com '). errors.full_messages (325.9ms) BEGIN (39.1ms) ROLLBACK => ["Сообщение должно существовать"] ' – Verty00

ответ

1

В Rails 5, когда мы определяем belongs_to ассоциацию, необходимо иметь соответствующую запись существует по умолчанию. Вам нужно установить аргумент optional: true, чтобы пропустить присутствие проверки.

class Attachment < ApplicationRecord 
    belongs_to :post, optional: true 
end 
+0

Большое вам спасибо. Это работало как прелесть! – Verty00