Is it possible to use the .powrc file to pass session variables to Rails based on the URL being accessed?

丶灬走出姿态 提交于 2019-12-12 04:07:04

问题


I have a Rails 2 app that serves multiple domains. That is, http://domainA.com and http://domainB.com are both served by the same Rails app. When I launch these manually, I specify which site I want to see by passing a site variable: site=domainB ruby script/server.

I'd like to use Pow so that I can access both sites via http://domainA.myapp.dev and http://domainB.myapp.dev (I'd also be happy with http://domainA.dev and http://domainB.dev if that's easier).

I can do this manually by adding export site="domainB" to my .powrc file, and editing that by hand (then doing touch tmp/restart.txt) each time I want to switch sites ... I'd prefer something a bit more automatic, though. I'm thinking something like the equivalent of subdomain == domainA ? export site="domainA" : export site="domainB" within the .powrc file.


回答1:


I've written the following rake task to switch sites with rake pow[SITENAME] until I can find a more automated solution. This code is also available as a Gist.

desc "Switches site that Pow serves"
task :pow, :site_name do |t, args|
  pow_config = "#{Rails.root}/.powrc"
  args.with_defaults(:site_name => "domainA")

  # Overwrite .powrc file with new site name
  file = File.open(pow_config, 'w')
  file.write "if [ -f \"$rvm_path/scripts/rvm\" ] && [ -f \".rvmrc\" ]; then
source \"$rvm_path/scripts/rvm\"
source \".rvmrc\"
fi

export site=#{args.site_name}"
  file.close

  # Restart Pow
  FileUtils.touch "#{Rails.root}/tmp/restart.txt"

  # Announce site change
  puts "Switched to #{args.site_name}"
end



回答2:


I figured out how to do this, and wrote a blog post about it here. This is the gist of how it's done...

I configured my before_filter to get the domain that's being accessed, and to use that throughout the Rails app. If the site is being accessed via the standard Rails app, it won't have a domain (it would just be localhost). In that case, the before_filter looks for the site variable being passed at the command line (and if that's not passed, then it uses a default site).

def set_site
  if RAILS_ENV == "development"
    session[:site] = case request.domain
      when "domainA.dev" then "domainA"
      when "domainB.dev" then "domainB"
      else ENV['site'] || "domainA"
    end
  else session[:site].blank?
    if RAILS_ENV == "staging"
      session[:site] = case request.subdomains.last # *.yourstagingdomain.com
        when "domainA" then "domainA"
        when "domainB" then "domainB"
      end
    elsif RAILS_ENV == "production"
      session[:site] = case request.domain
        when "domainA.com" then "domainA"
        when "domainB.com" then "domainB"
        else "domainA"
      end
    else
      session[:site] = "domainA" # default
    end
  end
  if @site.nil?
    @site ||= Site.find_by_name(session[:site])
  end
end

The whole thing is actually done within Rails itself, and the only involvement that Pow has is that there has to be a symlink for each site being served by the Rails app.

The symlinks must also match the request.domain that's being checked in the before_filter. So, in this example there would be two symlinks - domainA and domainB.



来源:https://stackoverflow.com/questions/10954945/is-it-possible-to-use-the-powrc-file-to-pass-session-variables-to-rails-based-o

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!