如何自动验证优惠券并调整价格?

时间:2015-05-09 13:00:18

标签: javascript ruby-on-rails ruby ajax ruby-on-rails-4

我尝试将优惠券添加到我的结帐页面,使用验证优惠券的AJAX请求并相应地更新价格。但是,在加载结帐视图时,我收到错误消息

  

表单中的第一个参数不能包含nil或为空

在输入优惠券的表格中引用行<%= form_for @actioncode, method: :post ...。我试图按照here的步骤进行操作。我应该如何调整我的代码?

设置: @actioncode是指管理员存储操作码的模型。 Coupon_code不包含在任何模型中,但是指用户在表单中输入的值。如果值存在(验证),则应根据Actioncode模型(特别是&#39; actioncode&#39;列)检查Coupon_code,如果是,则根据colum&quot;折扣中的Actioncode模型中的值更新价格#39;

结帐视图包含以下格式:

<%= form_for @actioncode, method: :post, url: {action: "check_actioncode"}, remote: true do |f| %> 
  <%= f.text_field :coupon_code, :placeholder => "Enter your coupon" %>
  <%= f.submit "Submit Coupon Code" %>
<% end %>

路线:

post 'check_actioncode' => 'actioncodes#check_actioncode'

动作码控制器中,我有:

def check_actioncode
  @actioncode = Actioncode.find(params[:coupon_code])
  respond_to do |format|
    if !@actioncode.nil?
      format.js   {}
    else
      flash.now[:success] = "Action code not found or expired"
    end
  end
end

组织控制器呈现结帐视图:

  def checkout
    @organization = Organization.new(organizationnew_params)
    if @organization.save
      @organization.members.each do |single_member|
        single_member.send_activation_email
      end
      @actioncode = Actioncode.new
      @amount = 100.00
      @currency = "EUR"
      @description = @organization.id
      @transaction_description = "My description"
      @transaction_type = "S"
      @hash = hash(@description, @amount, @currency, @transaction_type)
      render 'checkout'   # This renders the checkout view.
    else                            
      render 'new_premium'
    end
  end

更新:如果我将@actioncode = Actioncode.new添加到加载视图的控制器,我会收到另一条错误消息undefined method 'coupon_code',指的是表单的第二行。 coupon_code确实是一个未定义的变量,但它应该只是一个用户输入的临时值,并根据模型中的动作代码进行检查以进行验证。我该怎么做?

1 个答案:

答案 0 :(得分:1)

将表单更改为:

<%= form_for @actioncode, method: :post, url: {action: "check_actioncode", :controller => 'actioncodes'}, remote: true do |f| %>
  <%= f.text_field :actioncode, :placeholder => "Enter your coupon" %>

将您的控制器更改为:

def check_actioncode
  @actioncode = Actioncode.where(:actioncode => params[:actioncode][:actioncode]).first

  respond_to do |format|
    unless @actioncode.blank?
      format.js {}
    else
      flash.now[:success] = "Action code not found or expired"
    end
  end
end