我在尝试查看.pdf文件(使用PDFKit生成)未经身份验证时遇到问题,只是直接从给定的网址host/.../profile.pdf
开始。我按照预期要求输入图像中显示的凭据(不在users / sign_in路径中):
我输入了正确的凭据,该框上下移动并再次请求凭据。看起来好像用户或密码错了,但事实并非如此。控制器的相关代码在这里:
class Entrepreneur::ProfilesController < ApplicationController
before_filter :authenticate_user!
def show
respond_to do |format|
format.pdf do
html = render_to_string(:layout => false , :action => "show.html.haml")
kit = PDFKit.new(html)
send_data(kit.to_pdf, :filename => "name.pdf", :type => 'application/pdf')
end
end
end
end
你看不出任何幻想。我尝试从过滤器(before_filter :authenticate_user!, :except => [:show]
)中删除show动作,并自己编写一个自定义过滤器,将未经身份验证的用户重定向到new_session_path,但这样做我不知道如何在注册后将用户重定向到pdf show。
简而言之,设计在访问pdf节目时询问我的凭据并且不接受它们。如何让用户访问sign_in页面并在签名后重定向回到pdf?
我正在使用Rails 3.0.7,Ruby 1.8.7和Devise 1.1.5。
谢谢!
答案 0 :(得分:10)
首先,确保它实际上是Rails服务于PDF而不是前面的Web服务器。 (根据您的配置,可能是请求永远不会到达Rails。)
假设Rails服务于该文件,那么您应该检查您的devise.rb配置文件。您可能需要制作:pdf一种导航格式,允许Devise向您的sign_in页面发出302重定向:
config.navigational_formats = [:html, :pdf] # you may have additional formats
此外,您可能需要将PDF添加到mime_types.rb初始值设定项中,如果它尚未存在:
Mime::Type.register 'application/pdf', :pdf
答案 1 :(得分:3)
添加到已接受的答案并重复完整性:
更新您的设备配置(def checkNull(item):
if item != None:
return item.text.rstrip()
return " "
),将pdf包含为config/initializers/devise.rb
。
同时更新您的设备配置以使用自定义navigational_format
。
failure_app
自定义失败应用(require 'custom_failure'
Devise.setup do |config|
# Navigate on pdf request types (i.e. .pdf)
config.navigational_formats = ["*/*", :html, :pdf]
config.warden do |manager|
# Custom app to redirect to login page on unauthenticated pdf request types
manager.failure_app = CustomFailure
end
end
)
lib/custom_failure.rb