Saturday, 15 September 2012

ruby - Rails 4.0 undefined method `+' for nil:NilClass -



ruby - Rails 4.0 undefined method `+' for nil:NilClass -

i'm trying add together line orders_items controller if new order increment counter 0 one. have created action before save called when seek get:

undefined method `+' nil:nilclass class="lang-ruby prettyprint-override">def create @order_item = @order.order_items.find_or_initialize_by_product_id(params[:product_id]) # error below @order_item.quantity += 1 respond_to |format| if @order_item.save end end

order_item.rb:

class="lang-ruby prettyprint-override">class orderitem < activerecord::base belongs_to :order belongs_to :product validates :order_id, :product, presence: true validates :quantity, numericality: { only_integer: true, greater_than: 0 } def subtotal quantity * product.price end end

order_items_controller.rb:

class="lang-ruby prettyprint-override">class orderitemscontroller < applicationcontroller before_action :set_order_item, only: [:show, :edit, :destroy] before_action :load_order, only: [:create] # /order_items # /order_items.json def index @order_items = orderitem.all end # /order_items/new def new @order_item = orderitem.new end # post /order_items # post /order_items.json def create @order_item = @order.order_items.find_or_initialize_by_product_id(params[:product_id]) @order_item.quantity += 1 respond_to |format| if @order_item.save format.html { redirect_to @order, notice: 'successfully added product cart.' } format.json { render action: 'show', status: :created, location: @order_item } else format.html { render action: 'new' } format.json { render json: @order_item.errors, status: :unprocessable_entity } end end end # patch/put /order_items/1 # patch/put /order_items/1.json def update @order_item = orderitem.find(params[:id]) respond_to |format| if order_item_params[:quantity].to_i == 0 @order_item.destroy format.html { redirect_to @order_item.order, notice: 'order item updated.' } format.json { head :no_content } elsif @order_item.update(order_item_params) format.html { redirect_to @order_item.order, notice: 'successfully updated order item.' } format.json { head :no_content } else format.html { render action: 'edit' } format.json { render json: @order_item.errors, status: :unprocessable_entity} end end end # delete /order_items/1 # delete /order_items/1.json def destroy @order_item.destroy respond_to |format| format.html { redirect_to @order_item.order } format.json { head :no_content } end end private # utilize callbacks share mutual setup or constraints between actions. def load_order @order = order.find_or_initialize_by_id(session[:order_id], status: "unsubmitted") if @order.new_record? @order.save! session[:order_id] = @order.id end end def set_order_item @order_item = orderitem.find(params[:id]) end # never trust parameters scary internet, allow white list through. def order_item_params params.require(:order_item).permit(:product_id, :order_id, :quantity) end end

migration file:

class="lang-ruby prettyprint-override">class adddefaultquantitytoorderitems < activerecord::migration def alter change_column :order_items, :quantity, :integer, default: 0 end end

rails console:

@order.order_items.find_or_initialize_by_product_id(params[:product_id]) nomethoderror: undefined method `order_items' nil:nilclass (irb):1 /usr/local/rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.4/lib/rails/commands/console.rb:90:in `start' /usr/local/rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.4/lib/rails/commands/console.rb:9:in `start' /usr/local/rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.4/lib/rails/commands.rb:62:in `<top (required)>' bin/rails:4:in `require' bin/rails:4:in `<main>'

model order.rb:

class order < activerecord::base has_many :order_items, dependent: :destroy def total order_items.map(&:subtotal).sum end end

orders_controller.rb:

class orderscontroller < applicationcontroller before_action :set_order, only: [:show, :edit, :update, :destroy] # /orders # /orders.json def index @orders = order.all end # /orders/1 # /orders/1.json def show end # /orders/new def new @order = order.new end # /orders/1/edit def edit end # post /orders # post /orders.json def create @order = order.new(order_params) respond_to |format| if @order.save format.html { redirect_to @order, notice: 'order created.' } format.json { render action: 'show', status: :created, location: @order } else format.html { render action: 'new' } format.json { render json: @order.errors, status: :unprocessable_entity } end end end # patch/put /orders/1 # patch/put /orders/1.json def update respond_to |format| if @order.update(order_params) format.html { redirect_to @order, notice: 'order updated.' } format.json { head :no_content } else format.html { render action: 'edit' } format.json { render json: @order.errors, status: :unprocessable_entity } end end end # delete /orders/1 # delete /orders/1.json def destroy @order.destroy respond_to |format| format.html { redirect_to products_path } format.json { head :no_content } end end private # utilize callbacks share mutual setup or constraints between actions. def set_order @order = order.find(params[:id]) end # never trust parameters scary internet, allow white list through. def order_params params.require(:order).permit(:user_id, :status) end end

update

rake routes shows route phone call /:product_id

product.rb

class product < activerecord::base validates_numericality_of :price validates :stock ,numericality: { greater_than_or_equal_to: 0 } end

order.rb

# @chiperific added proper 4-line indentation viewing. class orderitem < activerecord::base belongs_to :order belongs_to :product validates :order_id, :product, presence: true validates :quantity, numericality: { only_integer: true, greater_than: 0 } def subtotal quantity * product.price end end

order items.rb

class orderitem < activerecord::base belongs_to :order belongs_to :product validates :order_id, :product, presence: true validates :quantity, numericality: { only_integer: true, greater_than: 0 } def subtotal quantity * product.price end end

when add together

def create @order_item = orderitems.find_or_initialize_by_product_id(params[:product_id]) @order_item.quantity +=1

i nameerror in orderitemscontroller#create - uninitialized constant orderitemscontroller::orderitems

def create @order_item = orderitems.find_or_initialize_by_product_id(params[:product_id]) <-error @order_item.quantity += 1

if seek

@order = order.find(params[:order_id]) @order_item = @order.order_items.find_or_initialize_by_product_id(params[:product_id]) @order_item.quantity += 1

i activerecord::recordnotfound in orderitemscontroller#create - couldn't find order without id

def create @order = order.find(params[:order_id]) @order_item = @order.order_items.find_or_initialize_by_product_id(params[:product_id])<-error @order_item.quantity += 1

you can initialize @order_item.quantity putting in orderitem class:

def quantity self.quantity ||= 0 end

ruby-on-rails ruby null actioncontroller

No comments:

Post a Comment