上传我是很新,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 %>
我怀疑是有关于'@ upload'验证错误。你在某处显示'@ upload.errors'吗?如果不是,它的价值是什么? – Carpetsmoker
所以,你对这些验证是正确的。我没有任何验证测试,所以我只是删除验证,尝试另一个文件上传,然后重定向工作。但是,当我尝试访问@upload时,它并未显示在用户显示页面上。记录的信息是否未被放入我的数据库中?或者它可能是别的东西? –
很难说;如果'@ upload.save'返回'true',那么它可能被保存到数据库中。通过使用'rails console'上的'Upload.last'来确保它实际上*是*。记录可能在数据库中,但是因为您删除了所有验证,所以'user_id'缺失。删除验证不是一个修复,看看错误是什么,修复*这是修复:-)你也可能在控制器渲染显示或视图代码时出现错误。 – Carpetsmoker