0

Mileages というモデルを持つ Rails 3.2 アプリケーションがあります。Prawn PDF を使用してマイレージ インデックス アクションの PDF 出力を追加しました。

Mileages_controller の index アクションは次のようになります。

def index
    @mileages = Mileage.find_all_by_user_id(current_user.id)
    @mileages_months = Mileage.find_all_by_user_id(current_user.id).group_by { |t| t.created_at.beginning_of_month }


    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @mileages }
      format.pdf do
            pdf = MileagePdf.new(@mileages, view_context)
            send_data pdf.render, filename: "mileages_report.pdf",
                                  type: "application/pdf",
                                  disposition: "inline"
          end
    end
  end

私がやりたいのは、インデックス ビューに PDF バージョンへのリンクを設定することですが、その横には開始日と終了日があります。PDF には、これら 2 つの日付の間のマイレージ エントリのみが表示されます。

PDFリンクは単に<%= link_to "Mileage Report (PDF)", mileages_path(@mileages, format: "pdf") %>

おそらく、activerecord フィルターは次のようになります。

@mileages = Milage.where(:date => ??..??)

上記を日付入力に結び付ける方法がわかりません。どんな助けでも大歓迎です!

4

1 に答える 1

1

日付があるので、一種のフォームを送信してみてください。

 <%= form_tag(mileages_path(format: :pdf), method: :get) do -%>
    <%= date_select("mileage_start", "date",  order: [:year,:month,:day])%>
    <%= date_select("mileage_end", "date",  order: [:year,:month,:day])%>
    <%= submit_tag %>
  <%end%>

UPDATED with Final answer from chat

  def index 
    start_date = params[:mileage_start] 
    end_date = params[:mileage_end] 
    if start_date && end_date 
      dates = get_start_and_end_date(start_date,end_date) 
      @mileages_pdf = Mileage.where(date: dates[:start_date]..dates[:end_date]) 
   end 

    respond_to do |format|
     # format.html # index.html.erb
     # format.json { render json: @mileages }
      format.pdf do
        pdf = MileagePdf.new(@mileages_pdf, view_context)
        send_data pdf.render, filename: "mileages_report.pdf",
        type: "application/pdf",
        disposition: "inline"
      end
    end   
  end 

  def get_start_and_end_date(start_date,end_date) 
    hsh = {} 
    hsh[:start_date] = build_date(start_date)
    hsh[:end_date] = build_date(end_date)
    hsh 
  end

  def build_date(hsh)
    DateTime.new(hsh["date(1i)"].to_i,hsh["date(2i)"].to_i,hsh["date(3i)"].to_i)
  end

このようにして、params から日付をキャプチャし、必要な方法でフォーマットして、クエリに配置できます。

于 2013-07-03T16:15:50.713 に答える