Yeah, I think Fred hit the nail on the head. directories/files#get is explicitly a call to fetch info, whereas #new is simply a call to create a local reference
Similarly, the #public_url method on file (for better or worse) was made to be cautious and accurate (so it checks that the file exists before giving a possibly bogus url). In that case, if you drop down to the helper that generates the actual URL it will also avoid the calls, which should hopefully give you what you need. Sorry for any confusion or lack of clarity there. If you have suggestions about how we could better communicate that we would love to hear them (and any documentation you might contribute would be awesome). Thanks! wes On Tue, Oct 28, 2014 at 9:00 AM, Frederick Cheung < [email protected]> wrote: > > d = storage.directories.new(:key => bucket) > d.files.get_https_url("example.txt", 300) > > shouldn't fire any requests although that generates a signed url > > The other approaches do seem to validate things like whether the file > exists and so on. > > Fred > > On 28 October 2014 at 13:29:31, David ([email protected]) wrote: > > Hello! > > > > I have a small issue with this fantastic gem (great work!). > > > > Here is a small script to get the public url of an object stored in S3: > > > > require "fog" > > > > > > # Fires one request > > storage = Fog::Storage.new( > > :provider => "AWS", > > :aws_access_key_id => ENV["AWS_KEY"], > > :aws_secret_access_key => ENV["AWS_SECRET"], > > :region => "eu-west-1" > > ) > > > > > > # Fires one request > > d = storage.directories.get(ENV["AWS_BUCKET"]) > > > > > > # Fires one request > > d.files.get("A.txt").public_url > > > > As you can see, this script will fire 3 requests to S3. > > > > Now, here is the same script but using the AWS sdk: > > > > require "aws" > > > > > > # No request fired > > s3 = AWS::S3.new( > > :access_key_id => ENV['AWS_KEY'], > > :secret_access_key => ENV['AWS_SECRET'] > > ) > > > > > > # No request fired > > b = s3.buckets[ENV["AWS_BUCKET"]] > > > > > > # No request fired > > b.objects["A.txt"].public_url.to_s > > > > There is not a single request fired. I guess that the idea behind this > is: > > don't hit S3 until you really, really need to. > > > > My main issue is the request fired to get the public_url of an object. > > Let me explain it with an example: let's pretend we are building a rails > > API backend for movies. Each movie is linked to a poster image which is > > stored in S3 (as a public read only object). > > Now for the index action, I want the backend to return simply the name of > > the movie and the url of the poster image. > > The issue here, is that the backend will get the Movie objects and then > for > > each object it will try to get the public url using the corresponding fog > > object. This will fire a request to S3 for each movie. > > As expected this works well for a small number of Movie objects but not > > with a reasonable large amount of Movie objects (let's say 100 => 100 > > requests to S3 have to be made to get the urls). > > > > The question is therefore: can we avoid this request when calling > > public_url on a Fog::Storage::AWS::File object? I was wondering if it is > > possible with Fog? > > > > I know, I could build the public url myself without using Fog. I could > get > > the url of the bucket with public_url of the Fog::Storage::AWS::Directory > > object and then, build the public url of the object using String > > concatenation/interpolation. The only downside is that, this kind of code > > is coupled with how S3 objects are organised. I'd like to keep the code > > "provider agnostic" as much as possible. If we change from S3 to another > > provider, it's only a matter of storage configuration. That's why we are > > using Fog instead of aws sdk. > > > > Thanks in advance for any answer. > > > > Regards, > > > > David > > > > -- > > You received this message because you are subscribed to the Google > Groups "ruby-fog" > > group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to [email protected]. > > For more options, visit https://groups.google.com/d/optout. > > > > -- > You received this message because you are subscribed to the Google Groups > "ruby-fog" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "ruby-fog" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
