0

私はそのような問題を抱えています:私は現在のユーザーのレポートを取得しており、入力から取得された日付に依存しています。

しかし、それらを xls 拡張子で同じページに渡す必要がありますが、今では次のようなエラーが発生しています -

    undefined method each for nil:NilClass

だからここに私のコントローラーがあります:

def index

if params[:report] && params[:report][:start_date] && params[:report][:end_date]
  @start_date = params[:report][:start_date]
  @end_date = params[:report][:end_date]
  @financial_reports = current_user.financial_reports.where(:created_at =>  @start_date.to_date..@end_date.to_date)

 respond_to do |format|
  format.html # index.html.erb
  format.xls
  format.xml  { render :xml => @financial_reports }
   end
  end
end

ここに私の index.xls.erb があります

          <?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:o="urn:schemas-microsoft-com:office:office"
  xmlns:x="urn:schemas-microsoft-com:office:excel"
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:html="http://www.w3.org/TR/REC-html40">
 <Worksheet ss:Name="Sheet1">
  <Table>
   <Row>
    <Cell><Data ss:Type="String">Amount</Data></Cell>
    <Cell><Data ss:Type="String">Currency</Data></Cell>
    <Cell><Data ss:Type="String">Created at</Data></Cell>
   </Row>
  <% @financial_reports.each do |financial_report| %>
  <Row>
    <Cell><Data ss:Type="Number"><%= financial_report.amount %></Data></Cell>
    <Cell><Data ss:Type="String"><%= financial_report.currency %></Data></Cell>
    <Cell><Data ss:Type="String"><%= financial_report.created_at %></Data></Cell>
  </Row>
   <% end %>
    </Table>
  </Worksheet>
</Workbook>

私のログ:

  Started GET "/financial_reports.xls" for 127.0.0.1 at 2012-08-09 16:52:30 +0300
   Processing by FinancialReportsController#index as XLS
  [1m[36mUser Load (0.0ms)[0m  [1mSELECT `users`.* FROM `users` WHERE `users`.`id` = 67 LIMIT 1[0m
   Rendered financial_reports/index.xls.erb (0.0ms)
  Completed 500 Internal Server Error in 20ms

 ActionView::Template::Error (undefined method `each' for nil:NilClass):
11:     <Cell><Data ss:Type="String">Currency</Data></Cell>
12:     <Cell><Data ss:Type="String">Created at</Data></Cell>
13:    </Row>
14:   <% @financial_reports.each do |financial_report| %>
15:   <Row>
16:     <Cell><Data ss:Type="Number"><%= financial_report.amount %></Data></Cell>
17:     <Cell><Data ss:Type="String"><%= financial_report.currency %></Data></Cell>
app/views/financial_reports/index.xls.erb:14:in     `_app_views_financial_reports_index_xls_erb__791914298_25744200'


  Rendered C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (10.0ms)
  Rendered C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.0ms)
  Rendered C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (30.0ms)

編集:コントローラーで呼び出している場合

   @financial_reports = current_user.financial_reports

動作していますが、WHERE条件を追加するとエラーが表示されます。

では、どうすればxmlビューに渡すことができますか?

4

2 に答える 2

0

「app/views//index.xml.erb」というビューを作成します

そして、あなたの見解をそれに固執します(erbタグなどを含むすべてのXMLビット)。

コントローラーで

respond_to do |format|
  format.html
  format.xls
  format.xml
end


current_user.financial_reports.where("financial_reports.created_at between ? and ?",params[:start_date].to_date,params[:end_date].to_date)
于 2012-08-09T10:13:43.060 に答える
0
undefined method each for nil:NilClass

nil オブジェクトを扱っていることを意味します。この場合は@financial_reportsです。なんで?WHERE条件に一致するレコードがデータベースにないためかもしれません。

この場合、nil オブジェクトのチェックを実装し、xls をレンダリングしないでください。

redirect_to <your_path_here> if @financial_reports.emtpy?
respond_to do |format|
....

これをデバッグする最良の方法は、rails consoleまたはdevelopment.logです。私が好むのはdevelopment.log、データベースに送信される SQL クエリと返される内容が表示されることです。

更新 - これを試してください

変化する:

if params[:report] && params[:report][:start_date] && params[:report][:end_date]
  @start_date = params[:report][:start_date]
  @end_date = params[:report][:end_date]
  @financial_reports = current_user.financial_reports.where(:created_at =>  @start_date.to_date..@end_date.to_date)

に:

if params[:start_date] && params[:end_date]
@financial_reports = current_user.financial_reports.where("financial_reports.created_at between ? and ?", params[:start_date].to_date, params[:end_date].to_date)
于 2012-08-09T13:48:14.543 に答える