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 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 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