csv下载前的rails\u操作
我正在使用Desive对用户进行身份验证。我希望他们能够在没有登录的情况下查看页面,但是如果他们希望下载csv数据,他们必须登录。下面是我如何设置csv下载部分的csv下载前的rails\u操作,csv,ruby-on-rails-4,devise,Csv,Ruby On Rails 4,Devise,我正在使用Desive对用户进行身份验证。我希望他们能够在没有登录的情况下查看页面,但是如果他们希望下载csv数据,他们必须登录。下面是我如何设置csv下载部分的 respond_to do |format| format.html{ render :layout => 'indices_show' } format.csv{ export_to_csv(idxp) } end 这里是导出到csv函数 def export_to_csv
respond_to do |format|
format.html{
render :layout => 'indices_show'
}
format.csv{
export_to_csv(idxp)
}
end
这里是导出到csv函数
def export_to_csv(idxf)
cash = params[:cash]
@title = get_title(@index)
if (cash =='1')
navs = @index.navsc.from(idxf)
r = @index.returnsc.from(idxf)
else
navs = @index.navs.from(idxf)
r = @index.returns.from(idxf)
end
dates = @index.dates.from(idxf)
csv_string = CSV.generate do |csv|
csv << [@title]
csv << ["Date", "Return", "NAV"]
dates.each_with_index do |d, i|
csv << [d,r[i],navs[i]]
end
end
send_data csv_string,
:type => 'text/csv; charset=iso-8859-1; header=present',
:disposition => "attachment; filename ="+ @title +".csv"
end
但是它没有做任何事情,因为用户仍然可以在不登录的情况下下载数据。我通过这样做找到了一个半解决办法
respond_to do |format|
format.html{
render :layout => 'indices_show'
}
format.csv{
if (user_signed_in?)
export_to_csv(idxp)
else
redirect_to new_user_session_path
end
}
end
这里的问题是,一旦用户登录,它就会重定向到主页。是否有一种方式,当用户单击下载按钮时,他们将被迫登录,登录后,他们将重定向回该页面并下载数据?谢谢操作之前的
不起作用,因为导出到\u csv
不是作为操作调用的方法-这通常是路由映射到的方法-即可能是包含响应代码的方法。当然,您可以将该方法分为两个单独的方法,一个用于html,一个用于csv,然后为csv设置before\u action
。这可能不太好,特别是如果它只是针对同一数据的两种不同的查看格式。如果它们不是非常相似的观点,也许将它们分开是合适的。这取决于你的应用程序
另一个选择是使用第二种方法,但对其进行修改。在将重定向到新的用户会话路径之前,请尝试为(:user,request.request\u uri)
插入对存储位置的调用,或者传递request.original\u url
。有关文档/代码,请参见此处:
您可以看到,如果存储位置存在,则优先使用根路径:
请注意,
的store\u location\u似乎是Desive最近增加的一项功能。我实际上使用的是3.1.x,它似乎没有定义-您必须直接将user\u return\u设置为
会话变量,因为这是在3.1.x中登录期间检查的内容。正如Tim所说,导出到\u csv
不是在\u操作之前被过滤的方法。它基于顶部的控制器操作方法触发操作,并且由于您试图将访问权限限制在较低的位置,因此它已经允许用户通过
我不确定您使用的操作名称,因此我假设它是show
您可以在执行操作之前为行提供一个条件,这可能会限制您的期望
before_action :authenticate_user!, only: [:show], if: proc { request.csv? }
是authenticate\u用户代码>上面的代码拼错了?不,对不起,那只是一个输入错误,我现在就纠正
before_action :authenticate_user!, only: [:show], if: proc { request.csv? }