Можно ли использовать файл .powrc для передачи переменных сеанса в Rails на основе доступного URL-адреса?

У меня есть приложение Rails 2, которое обслуживает несколько доменов. То есть http://domainA.com и http://domainB.com обслуживаются одним и тем же приложением Rails. Когда я запускаю их вручную, я указываю, какой сайт я хочу видеть, передавая переменную site: site=domainB ruby script/server.

Я хочу использовать Pow, чтобы иметь доступ к обоим сайтам через http://domainA.myapp.dev и http://domainB.myapp.dev (я также был бы доволен http://domainA.dev и http://domainB.dev если так проще).

Я могу сделать это вручную, добавив export site="domainB" в мой файл .powrc и отредактировав его вручную (затем выполняя touch tmp/restart.txt) каждый раз, когда я хочу сменить сайт... Однако я бы предпочел что-то более автоматическое. Я думаю что-то вроде эквивалента subdomain == domainA ? export site="domainA" : export site="domainB" в файле .powrc.


person James Chevalier    schedule 08.06.2012    source источник


Ответы (2)


Я написал следующую задачу rake для переключения сайтов с помощью rake pow[SITENAME], пока не найду более автоматизированное решение. Этот код также доступен в виде 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
person James Chevalier    schedule 08.06.2012

Я понял, как это сделать, и написал об этом сообщение в блоге здесь. Суть в том, как это делается...

Я настроил свой before_filter, чтобы получить доступ к домену и использовать его во всем приложении Rails. Если доступ к сайту осуществляется через стандартное приложение Rails, у него не будет домена (это будет просто localhost). В этом случае before_filter ищет переменную 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

На самом деле все это делается в самом Rails, и единственное участие Pow заключается в том, что должна быть символическая ссылка для каждого сайта, обслуживаемого приложением Rails.

Символические ссылки также должны соответствовать request.domain, которые проверяются в файле before_filter. Итак, в этом примере будет две симлинки — domainA и domainB.

person James Chevalier    schedule 12.06.2012