2016-03-07 49 views
0

上傳我是很新,Ruby和Rails和我在使用carrierwave_direct上傳一些問題。我使用carrierwave_direct上傳了Ryan Bates的Railscast 383。但是,他提供的解決方案似乎不適合我。我有一個用戶模型,我使用Devise創建,我有一個上傳器來處理我的上傳。我正嘗試使用上傳器上傳視頻文件,我計劃稍後使用帶有AWS API的彈性轉碼器對其進行轉碼。這些文件正在上傳到S3,但它似乎沒有與我的數據庫中的記錄相關聯。只要我提交它們就立即上傳文件,但我需要一種方法來創建它們以及標題,說明,以及其他潛在的參數。我的if-else語句也總是重定向到我的else語句。我認爲我的問題在我的控制器中;我的路線和看法似乎工作正常,我只是堅持這一個問題。問題用CarrierWave_Direct

爲了進一步澄清:我需要用戶能夠上傳視頻,然後讓用戶輸入一個標題,描述等,然後被重定向到另一個頁面。然後我需要能夠在稍後調用時顯示該文件。

這裏是我的UploadsController:

class UploadsController < ApplicationController 
before_action :authenticate_user!, only: [:create, :destroy] 
before_action :current_user, only: :destroy 

    def index 
    @uploader = Upload.new.video 
    @uploader.success_action_redirect = new_uploads_url 
    end 

    def show 
    @upload = Upload.find(params[:id]) 
    end 

    def new 
    @upload = Upload.new(key: params[:key]) 
    end 

    def create 
    @upload = Upload.new(upload_params) 
     if @upload.save 
     redirect_to home_index_path 
     return 
    else 
     redirect_to uploads_index_path 
    end 
    end 

    def edit 
    end 

    def destroy 
    @upload = Upload.find(params[:id]) 
    @upload.destroy 
    flash[:notice] = "Upload deleted" 
    redirect_to request.referrer || root_url 
    end 


    def upload_params 
    params.require(:upload).permit(:video, :title, :description) 
    end 
end 

這是我上傳型號:

class Upload < ActiveRecord::Base 
    belongs_to :user 
    default_scope -> { order(created_at: :desc) } 
    validates :user_id, presence: true 
    validates :description, presence: true 
    validates :title, presence: true, length: {maximum: 100} 
    validates :description, presence: true 
    validates :video, presence: true 
    mount_uploader :video, VideoUploader 

    after_save :enqueue_video 

    def enqueue_video 
    VideoWorker.perform_async(id, key) if key.present? 
    end 

class VideoWorker 
    include Sidekiq::Worker 

    def perform(id, key) 
    upload = Upload.find(id) 
    upload.key = key 
    video.remote_video_url = upload.video.direct_fog_url(with_path: true) 
    upload.save! 
    end 
end 
end 

我的路線:

Rails.application.routes.draw do 

    get '/home/index' 

    root 'home#index' 

    devise_for :users 

    get 'users/:id' => 'users#show' 

    resources :uploads 

    get '/index' => 'uploads#index' 

end 

編輯這裏是我的UsersController和用戶查看頁面也是:

控制器: 類UsersController < ApplicationController的

def show 
    @user = User.find(params[:id]) 
    end 

end 

顯示:

<h1><%= @user.username %></h1> 

<h3>Title:</h3> 
<%= @upload.title %> 
+0

我懷疑是有關於'@ upload'驗證錯誤。你在某處顯示'@ upload.errors'嗎?如果不是,它的價值是什麼? – Carpetsmoker

+0

所以,你對這些驗證是正確的。我沒有任何驗證測試,所以我只是刪除驗證,嘗試另一個文件上傳,然後重定向工作。但是,當我嘗試訪問@upload時,它並未顯示在用戶顯示頁面上。記錄的信息是否未被放入我的數據庫中?或者它可能是別的東西? –

+0

很難說;如果'@ upload.save'返回'true',那麼它可能被保存到數據庫中。通過使用'rails console'上的'Upload.last'來確保它實際上*是*。記錄可能在數據庫中,但是因爲您刪除了所有驗證,所以'user_id'缺失。刪除驗證不是一個修復,看看錯誤是什麼,修復*這是修復:-)你也可能在控制器渲染顯示或視圖代碼時出現錯誤。 – Carpetsmoker

回答

0

的問題是,你正在做的:

def create 
    @upload = Upload.new(upload_params) 
    # [..] 
end 

def upload_params 
    params.require(:upload).permit(:video, :title, :description) 
end 

並且您Upload鏈接到User與:

class Upload < ActiveRecord::Base 
    belongs_to :user 
    validates :user_id, presence: true 
    # [..] 
end 

那麼,如何Rails的知道哪些Upload屬於哪個User?你從來沒有告訴Upload任何'沒有User

如果你總是希望使用當前登錄的用戶,你也許可以這樣做:

def create 
    @upload = Upload.new(upload_params) 
    @upload.user = current_user 
    # [...] 
end 

這是假設,當然,current_user就是要在當前登錄用戶的正確方法(它通常是)。

如果您希望能夠將其連接到任何其他用戶,則需要在其中添加一個user_id字段並將其添加到upload_params

+0

就是這樣!我現在將用戶與上傳無縫關聯!這是我第一次遇到Stack Overflow問題,並且你真棒!我應該能夠從這裏弄清楚。哈哈希望。 –