下载入围候选人PDF时遇权限拒绝错误(附Rails相关代码)
权限拒绝错误:PDF导出功能无法正常工作
我实现了shortlisted控制器方法与shortlisted.html.erb视图,预期点击下载按钮时导出入围候选人列表为PDF文件,但点击后出现权限拒绝错误。
相关代码
控制器代码
def shortlisted ids= AppliedJob.shortlisted.pluck(:user_id) @shortlisted=User.where(id:ids) respond_to do |format| format.html format.pdf do render pdf: "file_name", template: 'users/shortlisted', layout: 'pdf.html.erb', page_size: 'A4', disposition: 'attachment', formats: [:html] end end end
视图代码(shortlisted.html.erb)
<%= link_to "download", shortlisted_path(format: :pdf) %>
错误截图

排查与解决步骤
检查路由权限配置
确认shortlisted路由是否配置了正确的权限验证逻辑,比如Devise的authenticate_user!或自定义权限判断。没有权限的用户触发请求会直接被拦截。可以在控制器开头添加权限校验:before_action :authenticate_user! # 或自定义权限检查方法 before_action :validate_export_permission def validate_export_permission unless current_user.has_permission?(:export_shortlisted) # 替换为你的权限判断逻辑 redirect_to root_path, alert: "无权限执行此操作" end end验证PDF生成库的文件权限
若使用wicked_pdf这类PDF生成库,需确保服务器进程(如Puma、Unicorn)拥有临时目录的读写权限。可手动指定临时目录并修复权限:format.pdf do render pdf: "file_name", template: 'users/shortlisted', layout: 'pdf.html.erb', page_size: 'A4', disposition: 'attachment', formats: [:html], temp_path: Rails.root.join('tmp', 'pdfs') # 自定义临时目录 end执行命令确保目录权限正确:
mkdir -p tmp/pdfs && chmod 755 tmp/pdfs限制无权限用户触发请求
在视图中仅对有权限的用户显示下载按钮,避免无效请求:<% if current_user.has_permission?(:export_shortlisted) %> <%= link_to "download", shortlisted_path(format: :pdf) %> <% end %>排查CSRF保护拦截
若请求被CSRF保护拦截,可临时在控制器中跳过验证测试(测试后需恢复安全配置):skip_before_action :verify_authenticity_token, only: [:shortlisted]
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

