0

私は現在これにかなり困惑しています。最近、Railsアプリケーションを更新する必要がありましたが、Visitorオブジェクトも保存しようとするオブジェクトを保存しようとすると、このエラーポップアップが表示されます。失敗しているコードは次のとおりです。

if @sale.shift_id.nil?
            @sale.update_attribute(:shift_id,session[:shift_id])
            @title = "New Sale"
            @sale = Sale.new
            @products = Product.order("name")
            @shifts = Shift.order("starttime")

#this line below is line 51, which the output says is the failing line.
            Visitor.new(:gender => 'Other', :shift_id => session[:current_shift_id], :reason_id => Reason.find_by_name("Products")).save

            redirect_to(newsale_path, :notice => 'successfully added the sale')
        else

私が得るエラーは次のとおりです。

undefined method `to_i' for #<Reason:0x56f5848>
Rails.root: 

Application Trace | Framework Trace | Full Trace
app/controllers/sales_controller.rb:51:in `new'
app/controllers/sales_controller.rb:51:in `create'

最初はReason.find_by_nameかもしれないと思ったので、それを有効な整数値に置き換えましたが、それでも失敗しました。失敗する可能性のある他のコードはroutes.rbだけで、次のエントリがあります。

match 'newsale', :to => 'sales#newsale'

最後に、webrickへの出力は、@ saleオブジェクトを保存するSQL呼び出しを実際に示しているため、混乱を招きます。次の行が表示されます。

SELECT "reasons".* FROM "reasons" WHERE "reasons"."name" = 'Products' LIMIT 1
Completed 500 Internal Server Error in 104ms
4

1 に答える 1

2

:reason_id => Reason.find_by_name("Products")ここで、Railsは、見つかったReasonインスタンスを整数値にキャストして、属性として設定しよ:reason_idうとしています(これは存在しません)Visitor.to_i

変更して、IDがどこにあるかをRailsに伝える必要があります

Reason.find_by_name("Products")

Reason.find_by_name("Products").id

to_iまたは、メソッドをオンにReasonして、アクションをそのままにしておくこともできます。

alias_method :to_i, :id
于 2013-02-12T18:48:47.197 に答える