2016-07-26 4 views
0

私はしばらくの間作業してきたプログラムを持っています。これは基本的なバーコードスキャンシステムです。 、私は起こるしたいもの、コントローラ変数へのRails変数の受け渡し

class RawsController < ApplicationController 
    def new 
     @raw = Raw.new 
    end 

     def create 
     @raw = Raw.new(params[raw_params]) 
     if @raw.save 
      receive(@raw) 
      redirect_to new_raw_path 
     end  
    end 

    def receive(raw) 
     scanned = Raw.find_by(code: raw.code) 
     if scanned.quantity.nil? 
      flash[:danger] = "no match" 
     else 
      scanned.quantity += 1 
      if scanned.save 
       respond_to do |format| 
        format.html {} 
        format.json{} 
       end 
      end 
     end 
    end 
private 
    def raw_params 
     params.require(:raw).permit(:code, :product, :quantity) 
    end 

end 

誰かがフォームにバーコード番号を入力したとき、それはのインスタンスとして@raw作成することです:生のこだわり

私のコントローラは以下の通りです生の(生のための)クラス。その後、受信機能では、在庫内の一致する商品を検索してから、1つのユニットを商品在庫に追加します。

しかし、いったんscanned.quantity += 1行になると、このメソッドはnilクラスでは定義されていないというエラーが発生し続けます。

私はscanned.quantity.nil?ラインに追加しました。そのフラッシュメッセージが表示されるので、問題は数量がゼロであることと関係しています。しかし、私はどのようにこれを修正するか分からない。

助けが必要ですか?

+0

はどのようにして 'scanned'がnilである場合には受信になっている:それはRaw.new(raw_params)

変更すべきですか? –

+0

'quantity 'は' nil'ではありませんが、 'scanned'は' nil'です。エラーメッセージの理解を助けるために、 'quantity'はあなたが' nil'に等しい 'scanned'からアクセスしようとしているメソッドです。 – sjagr

答えて

1

問題は、あなたがthis commentにポストされたデータを見るとRaw.new(...)

であなたの初期化であり、私はアクションが正しい属性を持つRawオブジェクトを作成していないことを言うことができます。保存する場合は、許可された属性を使用する必要があります。あなたはnewparams[raw_params]と呼んでおり、nilとなります。

def create 
    @raw = Raw.new(raw_params) 
    if @raw.save 
     receive(@raw) 
     redirect_to new_raw_path 
    end 
    end 
+0

はい!どうもありがとうございます。私は当初、強力なパラメータを考慮する必要があることを認識せずにこのプログラムを設計しました。構文が貧弱なために生じる単純な問題。それは決して実現しませんでした。再びありがとう。 – Mascasc

0

scanned.quantity.nil?のif節が成功したため、quantitynilですが、scannedオブジェクトが存在することを意味します。私はあなたのデフォルト値が0ではないと仮定します。

理想的には、その列をデータベースに追加した移行内のquantity列にデフォルト値の0を追加します。

ただし、インクリメントを実行する前に0に設定することができます。また、すでにRawオブジェクトを渡しているので、実際にはfind_byを実行する必要はありません。アクションは、そのオブジェクト自体に対して実行できます。

def receive(raw) 
    scanned = raw 

    if scanned.nil? 
     # your flash message 
    else 
     scanned.quantity ||= 0 
     scanned.quantity += 1 
     if scanned.save 
     respond_to do |format| 
      format.html {} 
      format.json{} 
     end 
     end 
    end 
end 
+0

私にとっての混乱は、移行のテスト変数の中に種を入れたことです。そのため量はゼロではありません。 – Mascasc

+0

'receive(@raw)'コールの前に 'puts @ raw.attributes'の結果を貼り付けることができますか? – aBadAssCowboy

+0

また、フェッチしているオブジェクトを既に渡しているので、 'receive'メソッドで' find_by'を実際に実行する必要はありません。私はそれを反映するために私の答えを更新しました。 – aBadAssCowboy

0

あなたがそのエラーを取得している理由ですnil値に+=をしようとしています。

あなたが値@raw.quantity @raw新しいインスタンスを作成している量のデフォルト値を変更するには、マイグレーションを書く0

class Raw 
    after_initialize :set_quantity 

    def set_quantity 
    self.quantity = 0 
    end 
end 

それとも

に数量を設定するために使用after_initializenil

です〜0

def change 
    change_column :raw, :quantity, :integer, default: 0 
end 
+0

私はまだ一致が得られません。これは、私の変数 "scanned"が見つからないことを意味します。 – Mascasc

+0

私が考えている限り、「nil」にすることはできません。あなたは '@ raw'を保存してそれを渡し、同じ' code'を使って 'Raw'に' find_by'を渡します。それは存在するはずです。 – aBadAssCowboy

+0

あなたの数量はゼロです –

関連する問題