2

我的应用程序允许用户登录并进行会话。我有一个用户控制器和一个会话控制器,主要是从 railscasts“从头开始授权”开发的。我最近添加了使用 jquery 上传器将文件上传到 S3 的功能......同样,其中很多来自 railscasts“上传到亚马逊 S3”。

问题是我的上传不是特定于用户的。现在我的“上传”控制器有一个“授权” before_filter 以确保您必须登录才能访问上传器;但是,一旦用户上传文件,所有用户都会看到上传!不好!我需要确保用户只能看到他们上传的相应文件。

我已经尝试了一些东西,但似乎都没有。我正在寻找有关如何确保用户只能看到他们上传的文件的方向。我正在关注关于嵌套资源的不同 railscasts 和 rails 文档(我认为这就是我必须这样做的方式?)但我一直遗漏一些东西,因为似乎有很多我不是 100% 理解的变化。我修复了一个错误,然后又遇到了另一个错误,我想知道我是否走在正确的道路上,或者我错过了什么?

我认为这应该起作用的方式是首先嵌套资源:

  resources :users do
    resources :cust_uploads
  end

然后我修改了模型如下并运行“rake db:migrate”将它们绑定在一起......我可能需要手动修改带有外国 id 字段的迁移文件?:

class User < ActiveRecord::Base
    has_secure_password
    attr_accessible :email, :password, :password_confirmation
    validates_uniqueness_of :email
    has_many :CustUploads
end

class CustUpload < ActiveRecord::Base
  attr_accessible :cust_file_url, :name
  before_create :default_name
  belongs_to :User

  def default_name
    self.name ||= File.basename(cust_file_url, '.*').titleize if cust_file_url
  end
end

这给了我大量的路径错误,我现在正在努力解决......因为我的 new_cust_upload_path 可能类似于 new_user_cust_upload_path

我也认为我的表单和控制器需要大量修改......

我正在使用 form_for

<%= form_for(@cust_upload) do |f| %>

我认为现在应该是@user.cust_upload?

目前的控制器:

class UsersController < ApplicationController
    def new
        @user = User.new
    end

    def create
      @user = User.new(params[:user])
      if @user.save
        session[:user_id] = @user.id
        redirect_to root_url, notice: "Thank you for signing up!"
      else
        render "new"
      end
    end

end

class CustUploadsController < ApplicationController
  before_filter :authorize
  def index
    @cust_uploads = CustUpload.all
  end

  def show
    @cust_upload = CustUpload.find(params[:id])
  end

  def new
    @cust_upload = CustUpload.new
  end

  def create
    @cust_upload = CustUpload.create(params[:cust_upload])
  end

  def edit
    @cust_upload = CustUpload.find(params[:id])
  end

  def update
    @cust_upload = CustUpload.find(params[:id])
    if @cust_upload.update_attributes(params[:cust_upload])
        redirect_to @cust_upload_url, notice: "Cust upload was successfully updated."
      else
        render :edit
    end
  end

  def destroy
    @cust_upload = CustUpload.find(params[:id])
    @cust_upload.destroy
    redirect_to cust_uploads_url, notice: "Cust Upload was successfully destroyed"
  end
end

任何方向将不胜感激。我已经学习了很多教程,并且可以从头开始做一些简单的事情,但我似乎无法将此功能与我现有的应用程序集成。这里有一些我无法思考的事情,我希望有人可以为我提供那个 Eurika 时刻!谢谢

编辑 routes.rb 和我的模型似乎有适当的连接(下面的代码)。当我在终端输入“rake routes”时,我得到了一个预期的列表(见下文),但是我得到了一个错误:“没有路由匹配 {:action=>"show", :controller=>"cust_uploads"}" for a link与 user_cust_uploads_path。cust_uploads 路径中有一个显示模板,并且 rake 路由说它存在!我错过了什么?

user_cust_uploads GET    /users/:user_id/cust_uploads(.:format)          cust_uploads#index
                      POST   /users/:user_id/cust_uploads(.:format)          cust_uploads#create
 new_user_cust_upload GET    /users/:user_id/cust_uploads/new(.:format)      cust_uploads#new
edit_user_cust_upload GET    /users/:user_id/cust_uploads/:id/edit(.:format) cust_uploads#edit
     user_cust_upload GET    /users/:user_id/cust_uploads/:id(.:format)      cust_uploads#show
4

1 回答 1

0

考虑到你想要达到

  1. 上传内容的用户应该只看到它们。

为什么不将上传与特定的用户 ID 相关联,然后在视图中显示它们时将它们从自己的 ID(current_user.uploads)中拉出

于 2013-01-08T16:13:15.633 回答