0

ビュー(ユーザーが入力)からコントローラーメソッドに値を渡し、コントローラーメソッドがDBからデータをフェッチします。以下は私の見解のコードです

<%= form_tag({:controller=>"billings", :action=>"tablebill"}, method: :get) do %>
  <div class="center-data">Table Number:
    <div class="tinput"> <%= text_field_tag(:tableno) %></div>
  </div>
  <div class="ebutton">
    <%= submit_tag "Enter" %>
  </div>
<% end %>

値 tableno は、コントローラーメソッドで必要なものであり、以下のようにコーディングされています

def tablebill
  @orders = List
   .select("itemname,tableno,quantity,amount")
   .where(:tableno => params[:tableno]).to_a

  @orders.each do |order|
    @totamount = @totamount + order.amount
  end

  @tax = @totamount/5
  @finalamount = @totamount + @tax

  respond_to do |format|
    format.html # tablebill.html.erb
  end  
end

値はクエリで正常に渡されていますが、nil が返されます。以下は私のサーバーからのスニペットです

Started GET "/billings/tablebill?utf8=%E2%9C%93&tableno=08&commit=Enter" for 127
.0.0.1 at 2013-09-05 15:50:01 +0530
  Processing by BillingsController#tablebill as HTML
  Parameters: {"utf8"=>"√", "tableno"=>"08", "commit"=>"Enter"}
  List Load (1.0ms)  SELECT itemname,tableno,quantity,amount FROM `lists` WHERE
`lists`.`tableno` = '08'
Completed 500 Internal Server Error in 230ms

NoMethodError (You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.+):
  app/controllers/billings_controller.rb:8:in `block in tablebill'
  app/controllers/billings_controller.rb:7:in `each'
  app/controllers/billings_controller.rb:7:in `tablebill'

問題は、Railsコンソールで同じクエリを実行すると、結果が得られることです。以下はレールコンソールからのスニペットです

irb(main):073:0> @orders = List.select("itemname,tableno,quantity,amount").where(:tableno => '08')
=> [#<List tableno: "08", itemname: "test81 ", quantity: "1", amount: "
3.25">, #<List tableno: "08", itemname: "Test82", quantity: "1", amou
nt: "3.75">, #<List tableno: "08", itemname: "Test83", quantity: "1
", amount: "3.75">]

DBに存在するほぼすべての値で多くのことを試しましたが、ビューを介して行うと毎回同じであり、Railsコンソールを介してクエリを実行すると結果が得られます。値を渡すことに問題はないと思うので、ここに投稿する前に多くのことを試しました。選択クエリが機能していないだけです。お知らせ下さい。ありがとう。

4

1 に答える 1

1

params[:tableno]nil が初期化されていないためだとは思いません@totamount。次に、最初のものを追加しようとすると、に追加order.amountできないため、エラーが発生しますnil

@totamount = 0ループの前に設定するか、次のいずれかを試してください。

@totamount = order.map(&:amount).inject(&:+)

すべての金額を合計します。

于 2013-09-05T10:47:50.007 に答える