【问题标题】:Increase items price after successful bid in rails在轨道中成功出价后提高物品价格
【发布时间】:2013-09-23 07:28:19
【问题描述】:

我有一个项目控制器和模型以及一个投标控制器和模型。当用户创建更高价格的新出价时,我想提高商品的当前出价。

当用户创建商品时,他们可以设置起始价格,即商品表中的“价格”列。

我的架构如下:

 create_table "bids", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "item_id"
    t.integer  "user_id"
    t.integer  "amount"
  end

  create_table "items", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
    t.string   "title"
    t.integer  "price"
  end

物品控制器:

class ItemsController < ApplicationController
  before_action :set_item, only: [:show, :edit, :update, :destroy]
  before_filter :user_signed_in?

  def index
    @item = Item.all
  end

  def show
    @item = Item.find(params[:id])

  end

  def edit
  end

  def new
    @item = Item.new
    @item.bids.build
  end

  def create
    @item = Item.new(item_params)
    if @item.save
      redirect_to @item, notice: 'Item successfully created.'
    else
      format.html { render action: 'new'}
    end
  end

  def update
    respond_to do |format|
      if @item.update(item_params)
        format.html { redirect_to @item, notice: 'Your item has been updated.'}
      else
        format.html { render action: 'edit'}
      end
    end
  end

  def destroy
    @item.destroy
    respond_to do |format|
      format.html { redirect_to items_url }
    end
  end


  private

  def set_item
    @item = Item.find(params[:id])
  end

  def item_params
    params[:item][:user_id] = current_user.id
    params[:item].permit(:price, :user_id, :title, :bids_attributes => [:amount, :user_id, :item_id])
  end



end

出价控制者:

class BidsController < ApplicationController
  before_action :set_bid, only: [:show, :edit, :update, :destroy]

  def show
    @bid = Bid.find(params[:id])
  end

  def new
    @item = Item.find(params[:item_id])
    @bid = @item.bids.build
  end

  def create
    @item = Item.find(params[:item_id])
    @bid = @item.bids.new(bid_params)

    respond_to do |format|
      if @bid.save
        format.html { redirect_to item_url(params[:track_id]), notice: "Bid successfully placed."}
      else
        format.html { render action: 'new' }
      end
    end
  end

    private
    def set_bid
      @bid = Bid.find(params[:id])
    end

    def bid_params
      params[:bid][:user_id] = current_user.id

      params[:bid].permit(:amount, :user_id, :item_id)
    end
end

实现这一目标的最佳方法是什么?我还需要创建一个验证,以确保输入的数字高于当前价格。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您可以在控制器或模型中执行此操作。为了方便,我喜欢在模型中做这种事情。您必须担心的另一件事是,如果取消出价会发生什么?您还需要更新父级。

    这段代码完全未经测试

    class Item < ActiveRecord::Base    
    
      def check_highest_bid
        highest_bid = self.bids.order("amount DESC").first.amount rescue 0
        self.price = highest_bid
        save
      end
    
    end
    
    class Bid < ActiveRecord::Base   
    
      validate :check_if_highest_bid
    
      after_save :update_item
      after_destroy :update_item
    
      def update_item
        self.item.check_highest_bid
      end     
    
      def check_if_highest_bid
         errors.add(:amount, "must be higher than current bid") unless self.item.price < self.amount
      end
    end
    

    文档: http://edgeguides.rubyonrails.org/active_record_validations.html#custom-methods

    【讨论】:

    • 一旦出价通过验证以检查金额是否高于价格,我将如何通过出价“金额”提高项目“价格”。
    • 谢谢。最高出价的验证工作。只需要弄清楚如何提高商品的定价。
    • 如果用户退出竞价会怎样?他们需要拿回他们的钱。我为用户创建了一个预算列,他们可以输入他们的预算。因此,当他们对某件商品出价时,需要从他们的预算中扣除资金,但如果他们出价,资金就会回到他们的账户。
    • 您在这里问的问题不止一个。 ;) 我还修复了Item#check_highest_bid 中的一个错误。该代码未经测试,但您应该能够弄清楚。
    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 2021-12-21
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    相关资源
    最近更新 更多