2016-03-07 55 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问题,并且你真棒!我应该能够从这里弄清楚。哈哈希望。 –