ruby-on-rails – 如何限制current_user在每个时间段内向订单添
发布时间:2020-12-16 21:06:54 所属栏目:百科 来源:网络整理
导读:我正在Rails中建立一个具有特定销售模型的商店.我需要允许用户每30天只向其订单添加3个项目. 30天计数器应该在添加第一个order_item时开始.一旦30天到期,用户将能够添加3个订单.如果30天没有通过,例如,用户添加了两个ord??er_items,他仍然可以在30天内再添加
我正在Rails中建立一个具有特定销售模型的商店.我需要允许用户每30天只向其订单添加3个项目. 30天计数器应该在添加第一个order_item时开始.一旦30天到期,用户将能够添加3个订单.如果30天没有通过,例如,用户添加了两个ord??er_items,他仍然可以在30天内再添加一个order_item.
因此,如果用户尝试添加超过3个项目以显示错误消息,并忽略将order_items保存到current_user的订单. 我有产品,订单,order_items,用户.我想我应该向用户模型添加一些内容,但我不确定是什么. order_items_controller.rb def create @order = current_order @order_item = @order.order_items.new(order_item_params) @order.user_id = current_user.id @order.save session[:order_id] = @order.id respond_to do |format| format.js { flash[:notice] = "ORDER HAS BEEN CREATED." } end end private def order_item_params params.require(:order_item).permit(:quantity,:product_id,:user_id) end end user.rb class User < ActiveRecord::Base has_many :identities,dependent: :destroy has_many :order # Include default devise modules. Others available are: # :confirmable,:lockable,:timeoutable and :omniauthable devise :omniauthable,:invitable,:database_authenticatable,:registerable,:recoverable,:rememberable,:trackable end order_item.rb class OrderItem < ActiveRecord::Base belongs_to :product belongs_to :order validates :quantity,presence: true,numericality: { only_integer: true,greater_than: 0 } validate :product_present validate :order_present before_save :finalize def unit_price if persisted? self[:unit_price] else product.price end end def total_price unit_price * quantity end private def product_present if product.nil? errors.add(:product,"is not valid or is not active.") end end def order_present if order.nil? errors.add(:order,"is not a valid order.") end end def finalize self[:unit_price] = unit_price self[:total_price] = quantity * self[:unit_price] end end order.rb class Order < ActiveRecord::Base belongs_to :order_status has_many :order_items before_create :set_order_status before_save :update_subtotal def subtotal order_items.collect { |oi| oi.valid? ? (oi.quantity * oi.unit_price) : 0 }.sum end private def set_order_status self.order_status_id = 1 end def update_subtotal self[:subtotal] = subtotal end end carts_controller.rb class CartsController < ApplicationController def show @order_items = current_order.order_items end 的routes.rb resources :order_items,only: [:create,:update,:destroy,:new] form.html.erb <%= form_for OrderItem.new,html: {class: "add-to-cart"},remote: true do |f| %> <div class="input-group"> <%= f.hidden_field :quantity,value: 1,min: 1 %> <div class="input-group-btn"> <%= f.hidden_field :product_id,value: product.id %> <%= f.submit "Add to Cart",data: { confirm: 'Are you sure that you want to order this item for current month?'},class: "btn btn-default black-background white" %> </div> </div> <% end %> </div> 解决方法
我会将begin_date和order_counter添加到用户模型.每次添加订单时,查看begin_date是否超过30天,然后将begin_date设置为实际日期.如果begin_date少于30??天前,请增加计数器.如果计数器已经3拒绝订单.
您可以通过命令行参数将列添加到用户表 rails generate migration AddOrderCounterToUser 这将在db / migrations中创建一个类: class AddPartNumberToProducts < ActiveRecord::Migration def change add_column :users,:begin_date,:date add_column :users,:order_counter,:integer end end 在UserController中添加其他属性以允许它们在user_params中. 然后在OrderItemController中更改create方法 def create now = Date.today success = false if current_user.begin_date && ((now - 30) < current_user.begin_date) if current_user.order_counter >= 3 # deal with the case that order should not be created,# for example redirect. else current_user.order_counter += 1 current_user.save success = true end else current_user.order_counter = 1 current_user.begin_date = now current_user.save success = true end if success @order = current_order @order_item = @order.order_items.new(order_item_params) @order.user_id = current_user.id @order.save session[:order_id] = @order.id respond_to do |format| format.js { flash[:notice] = "ORDER HAS BEEN CREATED." } end else respond_to do |format| format.js { flash[:notice] = "CREATION NOT POSSIBLE." } end end end 您还可以将检查代码放在用户模型中的方法中,这样可以更清晰. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- c – 以单个Pthread打印
- hdu 3076 ssworld VS DDD 概率dp
- tensor shape can be flexible to determined in
- 如何使用C#文件API检查磁盘上的逻辑和物理文件大
- PostgreSQL 9.1 选项standard_conforming_string
- ruby-on-rails – Capistrano:Bundler不使用rvm
- c# – 在.net控制台应用程序中显示消息框
- POSTGRESQL大对象ID操作例子,文件上传到POSTGRE
- ArcGIS server for .net 中应用API for flex 问题
- ios – 缺少推送通知权利.应用程序签名的权利不包
热点阅读