Rails and asset hosts with SSL

I’m trying to have my website on both http and https using the request
object as in the

documentation:

I’ve tried many configurations and many combinations, right now this is
what I have in my
environment/staging.rbconfig.action_controller.asset_host
= Proc.new { |source, request=nil| if request && request.ssl?
https://staging.foobar.it” else "http://assets#{ ( source.length % 4 )

  • 1
    }.staging.foobar.it" end }

with this solution it appears like the request object is always set at
nil.

I’m using Ruby 1.9.3 and rails 3.2.12, with nginx as reverse proxy and
unicorn as app server, and precompiling my assets

Has someone been able to configure this and have the https website link
to
the right https asset server? What am I doing wrong?

TIA,
ngw

On Thursday, March 7, 2013 11:45:22 AM UTC+1, ngw wrote:

CUT

Sorry for the formatting

config.action_controller.asset_host = Proc.new { |source, request=nil|
if request && request.ssl?
https://staging.foobar.it
else
http://assets#{ http://assets/#{ ( source.length % 4 ) + 1
}.
staging.foobar.it”
end
}

Hope it’s more clear. It’s bascially copied from the docs :slight_smile:

ngw

On 7 March 2013 10:49, ngw [email protected] wrote:

On Thursday, March 7, 2013 11:45:22 AM UTC+1, ngw wrote:

CUT

Sorry for the formatting

config.action_controller.asset_host = Proc.new { |source, request=nil|

Why have you got request=nil in the line above?

Colin

On Thursday, March 7, 2013 12:45:05 PM UTC+1, Colin L. wrote:

Why have you got request=nil in the line above?
Because if not I get

$ RAILS_ENV=staging bundle exec rake assets:precompile
rake aborted! This asset host cannot be computed without a request in
scope. Remove the second argument to your asset_host Proc if you do not
need the request.

Seems a bug in Rails to me honestly…

ngw

On Thursday, March 7, 2013 2:48:33 PM UTC+1, Frederick C. wrote:

However, you will presumably still need to deal with the fact that your
precompiled assets will be either all ssl or all non ssl - if you serve
some css that references (eg via background-url) a non ssl asset then I’d
expect you to run into mixed content warnings.

That’s exactly it, thanks a lot. Maybe Rails docs should be corrected?

ngw

On Thursday, March 7, 2013 10:49:48 AM UTC, ngw wrote:

    "https://staging.foobar.it"
else
    "http://assets#{ <http://assets/#%7B> ( source.length % 4 ) + 1 }.

staging.foobar.it"
end
}

Hope it’s more clear. It’s bascially copied from the docs :slight_smile:

Looking at the code, rails uses the arity of your proc to decide what to
do. If the arity is 1 it passes just the source, if it is 2 it passes
both,
but will blow up when there is no request available (and warn you to)
and
if the arity is negative (you can pass as many optional arguments as you
want) it passes both.

the problem is that lambda {|x,y=nil|} counts as an arity of 1, so rails
doesn’t try to pass the request, if you do lambda {|x,*y|} then you
should
get the request in y (y will be an array).

However, you will presumably still need to deal with the fact that your
precompiled assets will be either all ssl or all non ssl - if you serve
some css that references (eg via background-url) a non ssl asset then
I’d
expect you to run into mixed content warnings.

Fred