Пути к файлам легко спутать с URL-адресами, но это важное различие. То, что имеет URL-путь /a/b.txt
, фактически находится в системном пути #{Rails.root}/public/a/b.txt
, поэтому вам может потребоваться решить эту проблему путем генерации обоих в тандеме.
Вот как вы можете решить эту проблему:
def download
base_path = "downloads/xxx.html"
system_path = File.expand_path("public/#{base_path}", Rails.root)
url_path = "/#{base_path}"
File.open(file_path, "w") do |f|
f.puts render_to_string(:action => :show, :layout => nil)
end
flash[:notice] = "saved to #{base_path}"
redirect_to(url_path)
end
Вы не можете перенаправить ресурс, который не доступен через ваш веб-сервер, и, как правило, только вещи в public/
установлены таким образом. Вы можете включить дополнительные пути, если настроите свой сервер соответствующим образом.
Вы также можете обойти весь этот процесс, просто отобразив ответ в виде загружаемого встроенного вложения, если вы предпочитаете:
render(:action => :show, :layout => nil, :content_type=> 'application/octet-stream')