1

我正在创建一个应用程序,该应用程序允许用户将数据存储在其个人保管箱中的应用程序控制的受保护文件夹中。因此,每个用户都需要在自己的个人保管箱帐户中存储和访问文件。

为此,我想利用回形针保管箱 gem 进行存储。它允许回形针直接上传到保管箱:https ://github.com/janko-m/paperclip-dropbox 。

这是为回形针保管箱 gem 设置授权信息的代码。注意:current_user 目前不工作。我只是把它放在那里概述当前设置工作需要发生的事情。

图片.rb

has_attached_file :avatar,
                  :storage => :dropbox,
                  :dropbox_credentials => {app_key: DROPBOX_KEY,
                                           app_secret: DROPBOX_SECRET,
                                           access_token: current_user.token,
                                           access_secret: current_user.secret, 
                                           user_id: current_user.uid, 
                                           access_type: "app_folder"}

请注意,保管箱身份验证要求 current_user 获取该特定凭据集。

我知道 current_user 不应该从模型中访问,我想保持这种方式,所以任何人都可以帮助我弄清楚如何使用当前设置来做到这一点?还是建议更好的选择?

基本上,我需要根据每个用户有条件地更改 access_token、access_secret 和 user_id。

谢谢!

4

3 回答 3

2

我将回答我自己的问题,因为其他答案太模糊而无法接受——尽管它们走在正确的道路上。我认为社区更喜欢有更多代码的答案来支持它。

所以这里。要has_attached_file动态更改,您必须在附件模型中有一个user_id列,这样您就不会调用current_user(如果没有丑陋的黑客,这是不可能的)。然后你还需要一个belongs_to来完成用户关联。假设我将音频文件附加Song到此示例的模型中。

获取动态设置变量的关键是使用after_initialize回调初始化附件。

歌曲.rb

belongs_to :user    
has_attached_file :audio
after_initialize :init_attachment

def init_attachment
    self.class.has_attached_file :audio,
    :storage => :dropbox,
    :dropbox_credentials => {app_key: DROPBOX_KEY,
                             app_secret: DROPBOX_SECRET,
                             access_token: self.user.token,
                             access_token_secret: self.user.secret,
                             user_id: self.user.id
                             access_type: "app_folder"},
    :dropbox_options => {}
end

当然,您可以自由地以不同方式设置您的关联,但这是所提出问题的有效代码示例。

于 2013-10-24T03:28:20.127 回答
0

我认为您应该做的第一件事是设置关联Image.belongs_to :user- 然后您可以简单地使用user.tokenetc. 而不是引用current_user.

现在是困难的部分。您不能简单地键入:

access_token: user.token

因为selfImage根本不响应user方法的类(它是实例方法)。我的想法是修改这个 gem,以便它可以接受 lambdas 作为参数,并在调用时将附件实例(例如)传递给这个 lambda。问题是我不知道以这种方式修改这个 gem 是否很难。

于 2013-10-18T09:04:43.833 回答
0

刚刚发现此资源可能会从中受益:Ruby on Rails - Paperclip and dynamic parameters

更具体地说,我认为这可能会对您正在做的事情有所了解:

# AssetsController
def create
  @project = Project.find(params[:project_id])
  @asset = @project.assets.build(params[:asset])
  @asset.uploaded_by = current_user

  respond_to do |format|
    # all this is unrelated and can stay the same
  end
end

注意到控制器中设置了“@asset.uploaded_by”吗?也许您可以将类似的变量传递给您的模型?我不知道具体该怎么做,但是您基本上可以在尝试保存文件之前设置保存选项,从而使您能够动态设置选项

于 2013-10-22T09:13:12.640 回答