Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
csv下载前的rails\u操作_Csv_Ruby On Rails 4_Devise - Fatal编程技术网

csv下载前的rails\u操作

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

我正在使用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(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? }