Rails有助于集成嵌套?用户特定上传到现有应用程序

时间:2013-01-08 16:06:13

标签: ruby-on-rails authentication nested associations

我的应用允许用户登录并拥有会话。我有一个用户控制器和一个会话控制器,主要是从railscasts"从头开始授权"开发的。 我最近添加了使用jquery上传程序将文件上传到S3的功能......再次大部分来自railscasts"上传到亚马逊S3"。

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

我尝试了一些事情,但似乎都没有。我正在寻找一些方向来确保用户只能看到他们上传的文件。我在嵌套资源上关注不同的railscast和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和我的模型似乎有适当的连接(下面的代码)。在终端I中键入&#34; rake routes&#34;我按预期获得了一个列表(见下文)但是我得到并且错误:&#34;没有路由匹配{:action =&gt;&#34; show&#34;,:controller =&gt;&#34; cust_uploads&#34 ;}&#34;与user_cust_uploads_path的链接。 cust_uploads路径中有一个show模板,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

1 个答案:

答案 0 :(得分:0)

考虑到你想要实现

  1. 上传内容的用户只能看到它们。
  2. 为什么不将上传与特定用户ID相关联,然后在视图中显示它们时,将它们从自己的ID(current_user.uploads)中拉出来