使用 CarrierWave_Direct 上传时出现问题
Issue with uploading using CarrierWave_Direct
我是 ruby 和 rails 的新手,使用 carrierwave_direct 上传时遇到了一些问题。我按照 Ryan Bates 的 Railscast 383 使用 carrierwave_direct 进行上传。但是,他提供的解决方案似乎对我不起作用。我有一个使用 Devise 创建的用户模型,我有一个处理我的上传的上传器。我正在尝试使用上传器上传视频文件,我计划稍后使用 Elastic Transoder 和 AWS API 进行转码。这些文件可以很好地上传到 s3,但似乎它们没有与我提交后立即上传的 database.The 文件中的记录相关联,但我需要一种方法来创建它们以及标题,a描述,以及稍后可能的其他参数。我的 if-else 语句也总是重定向到我的 else 语句。我认为我的问题出在我的控制器上;我的路线和视图似乎工作正常,我只是被困在这个问题上。
进一步澄清:我需要用户能够上传视频,然后让用户输入标题、描述等,然后被重定向到另一个页面。然后我需要能够在稍后被调用时显示该文件。
这是我的 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 和用户显示页面:
控制器:
class 用户控制器 < 应用程序控制器
def show
@user = User.find(params[:id])
end
end
显示:
<h1><%= @user.username %></h1>
<h3>Title:</h3>
<%= @upload.title %>
问题是你在做:
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
。
我是 ruby 和 rails 的新手,使用 carrierwave_direct 上传时遇到了一些问题。我按照 Ryan Bates 的 Railscast 383 使用 carrierwave_direct 进行上传。但是,他提供的解决方案似乎对我不起作用。我有一个使用 Devise 创建的用户模型,我有一个处理我的上传的上传器。我正在尝试使用上传器上传视频文件,我计划稍后使用 Elastic Transoder 和 AWS API 进行转码。这些文件可以很好地上传到 s3,但似乎它们没有与我提交后立即上传的 database.The 文件中的记录相关联,但我需要一种方法来创建它们以及标题,a描述,以及稍后可能的其他参数。我的 if-else 语句也总是重定向到我的 else 语句。我认为我的问题出在我的控制器上;我的路线和视图似乎工作正常,我只是被困在这个问题上。
进一步澄清:我需要用户能够上传视频,然后让用户输入标题、描述等,然后被重定向到另一个页面。然后我需要能够在稍后被调用时显示该文件。
这是我的 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 和用户显示页面:
控制器: class 用户控制器 < 应用程序控制器
def show
@user = User.find(params[:id])
end
end
显示:
<h1><%= @user.username %></h1>
<h3>Title:</h3>
<%= @upload.title %>
问题是你在做:
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
。