加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby on Rails nil无法强制转换为BigDecimal

发布时间:2020-12-16 20:54:28 所属栏目:百科 来源:网络整理
导读:当我尝试执行计算时,为什么无法将nil强制转换为BigDecimal:这是代码: 模型/ drink.rb class Drink ActiveRecord::Base belongs_to :menu before_save :total_amount def total_amount self.total_amount = self.price * self.quantityend 模型/ menu.rb cl
当我尝试执行计算时,为什么无法将nil强制转换为BigDecimal:这是代码:

模型/ drink.rb

class Drink < ActiveRecord::Base
  belongs_to :menu 
  before_save :total_amount 

def total_amount
    self.total_amount = self.price * self.quantity
end

模型/ menu.rb

class Menu < ActiveRecord::Base
    has_many :drinks,:dependent => :destroy
    accepts_nested_attributes_for :drinks,:allow_destroy => true
    #Validations

end

* Drink是(嵌套)子模型,Menu是父模型当我尝试创建新饮料时,浏览器显示以下错误消息nil无法强制进入BigDecimal app / models / drink.rb:7:in’total-量’
app / controllers / menus_controller.rb:47:’create’
app / controllers / menus_controller.rb:46:’create’

应用程序/分贝/迁移

class CreateDrinks < ActiveRecord::Migration
  def change
    create_table :drinks do |t|
      t.string :name
      t.decimal :quantity,:precision => 8,:scale => 2
      t.decimal :price,:scale => 2
      t.decimal :vat,:scale => 2
      t.references :menu

      t.timestamps
    end
    add_index :drinks,:menu_id
  end
end

控制器/ drinks_controller.rb

class DrinksController < ApplicationController
      # GET /drinks
      # GET /drinks.json
      def index
        @drinks = Drink.all

        respond_to do |format|
          format.html # index.html.erb
          format.json { render :json => @drinks }
        end
      end

      # GET /drinks/1
      # GET /drinks/1.json
      def show
        @drink = Drink.find(params[:id])

        respond_to do |format|
          format.html # show.html.erb
          format.json { render :json => @drink }
        end
      end

      # GET /drinks/new
      # GET /drinks/new.json
      def new
        @drink = Drink.new

        respond_to do |format|
          format.html # new.html.erb
          format.json { render :json => @drink }
        end
      end

      # GET /drinks/1/edit
      def edit
        @drink = Drink.find(params[:id])
      end

      # POST /drinks
      # POST /drinks.json
      def create
        @article = Drink.new(params[:drink])

        respond_to do |format|
          if @drink.save
            format.html { redirect_to @drink,:notice => 'Drink was successfully created.' }
            format.json { render :json => @drink,:status => :created,:location => @article }
          else
            format.html { render :action => "new" }
            format.json { render :json => @drink.errors,:status => :unprocessable_entity }
          end
        end
      end

      # PUT /drinks/1
      # PUT /drinks/1.json
      def update
        @drink = Drink.find(params[:id])

        respond_to do |format|
          if @drink.update_attributes(params[:drink])
            format.html { redirect_to @drink,:notice => 'Drink was successfully updated.' }
            format.json { head :ok }
          else
            format.html { render :action => "edit" }
            format.json { render :json => @drink.errors,:status => :unprocessable_entity }
          end
        end
      end

      # DELETE /drinks/1
      # DELETE /drinks/1.json
      def destroy
        @drink = Drink.find(params[:id])
        @drink.destroy

        respond_to do |format|
          format.html { redirect_to drinks_url }
          format.json { head :ok }
        end
      end 
    end

请问有谁可以告诉我代码有什么问题?

解决方法

如果你想将nil评估为0.0,那么你可以这样做:
def total_amount
    self.total_amount = self.price.to_s.to_d * self.quantity.to_s.to_d
end

或者明确检查是否为零

def total_amount
  if self.price && self.quantity
    self.total_amount = self.price * self.quantity
  else
    self.total_amount = "0.0".to_d
  end
end

问题实际上是你的记录字段没有像你期望的那样设置.您是否需要使用验证来确保设置价格和数量字段?

class Drink
  validates :price,:presence => true      # Don't forget add DB validations,too :)
  validates :quantity,:presence => true
end

这样你就可以确保在调用#total_amount时没有得到nil值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读