2011-11-29 116 views
0

我有一個Rails應用程序,它具有生成報告的功能。傳遞參數的優雅方式

之前產生所述報告中,向用戶呈現與指定報告的日期範圍內的形式,

<%= form_tag({:action => :generate_report}, :multipart => true) do %> 

    <h3>Date range is inclusive</h3> 

    <b>Start Date</b><br /> 
    <%= date_select :range, :startDate, options = {:order => [:day, :month, :year]} % 

    <b>End Date</b><br /> 
    <%= date_select :range, :endDate, options = {:order => [:day, :month, :year]} %> 

    <%= submit_tag "Generate Report", :disable_with => 'Reporting...' %> 

<% end %> 

支撐代碼然後生成報告,

# GET /sales_activities/generate_report 
def generate_report 

    @start_date = Date.civil(params[:range][:"startDate(1i)"].to_i,params[:range][:"startDate(2i)"].to_i,params[:range][:"startDate(3i)"].to_i) 
    @end_date = Date.civil(params[:range][:"endDate(1i)"].to_i,params[:range][:"endDate(2i)"].to_i,params[:range][:"endDate(3i)"].to_i) 

    @end_date_inclusive = @end_date + 1.day 

    @sales = SalesActivity.find(:all, 
       :select => [:salesperson_id], 
       :conditions => {:created_at => @[email protected]_date_inclusive, :code => [5]}, 
       :group => :salesperson_id) 

    # <Skip the boring code> 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @report } 
     format.json { render :json => @report } 
    end 
    end 

然後是視圖以通常的方式呈現。如果用戶喜歡他們看到的內容,則他們可以選擇將報告導出爲csv。

我目前有以下代碼將指定的範圍傳遞給生成相同報表以供導出的方法,但它看起來不是很差,錯誤,很好,並且會導致長時間的URL。

<h2>Regulatory Report</h2> 

<h4>Reporting Period from <%= @start_date.strftime('%d/%m/%y') %> to <%= @end_date.strftime('%d/%m/%y') %></h4> 

    <%= link_to image_tag("Buttons/ExportReport.png", :border => 0), report_export_sales_activities_path(:start_date_str => @start_date, :end_date_str => @end_date) %> 

我的問題是,有沒有更好的方法將這些參數傳遞給導出方法?謝謝。

+0

使用POST請求將讓你的參數了網址,並縮短了位產生的PARAMS格式。 http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html這就是你想要的嗎? –

回答

1

AR將讓你使用由date_select助手直接

@sales = SalesActivity.where(['(created_at BETWEEN ? AND ?', params[:range][:start_date], params[:range][:end_date]])