【问题标题】:How to automatically validate coupon and adjust price?如何自动验证优惠券并调整价格?
【发布时间】:2015-05-09 13:00:17
【问题描述】:

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

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

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

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

结帐视图包含以下表单:

<%= 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'

actioncodes 控制器我有:

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 确实是一个未定义的变量,但它应该只是用户输入的临时值,并根据模型中的操作代码进行检查以进行验证。我该怎么做?

【问题讨论】:

  • 你试过&lt;%= form_for @actioncode, url: {action: "check_actioncode"}, remote: true do |f| %&gt;
  • 谢谢,试过了,然后在加载时收到不同的错误消息:First argument in form cannot contain nil or be empty 指的是同一行。
  • 好的,这就是进展,用相关的错误消息更新您的问题,以便我们查看并进一步帮助您
  • 我更新了原帖。不确定“粘贴到 form_for 的 html 渲染中”是什么意思。表单直接包含在视图文件中(所以不是部分的)。
  • 好的,那&lt;%= form_for @actioncode, method: :post, url: {action: "check_actioncode"} ...

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


【解决方案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

【讨论】:

  • 谢谢,我按照指示做了,但收到错误消息:First argument in form cannot contain nil or be empty,指的是form_for @actioncode … 行。
  • actioncode 和 coupon_code 有区别。有一个只有管理员才能写入数据的操作代码模型。此模型包含用户在支付帐户时可能使用的所有操作代码。 Coupon_code 是指用户在结账时输入的值。这个想法是检查优惠券代码是否存在于 actioncodes 模型中。如果是这样:应用与正确的actioncode记录对应的条件。与 actioncodes 模型一样,用户模型也有一个名为“actioncode”的列。这个想法是在结帐后将使用的操作代码的 id 写入最后一列。
  • 通过我正在尝试的所有测试,我不小心注释掉了控制器中的一行。更正这一点,新的我有错误消息:No route matches {:action=&gt;"check_actioncode", :controller=&gt;"organizations"}。但正如您在原始帖子中看到的那样,路线已定义。
  • 不,它没有定义。 check_actioncode 方法在 actioncodes 控制器中,而不是 organizations 控制器中。
  • 我看不出有任何理由拥有coupon_code 属性。
猜你喜欢
  • 1970-01-01
  • 2023-01-17
  • 2014-09-10
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2021-01-19
相关资源
最近更新 更多