【问题标题】:Rails 4.2 : Form with multiple models - param is missing or the valueRails 4.2:具有多个模型的表单 - 缺少参数或值
【发布时间】:2018-03-17 08:35:54
【问题描述】:

我在使用 Rails 4.2 创建具有多个模型的表单时遇到问题。 我正在创建一个表单,以允许用户订购一张带有自定义条纹支付表单的礼品卡。 我尝试了使用 form_tag 而不是 simple_form_for 和 simple_fields_for 的不同方法,我尝试了这个网站上提供的所有解决方案,但我找不到摆脱这个地狱的方法!

我的表格如下:

     =simple_form_for @giftcard, url: gift_cards_path, html: {"accept-charset" => "UTF-8", :autocomplete => "off", :enctype => "multipart/form-data", :method => "post" } do |f|

      (...)

      = field_set_tag 'Delivery mode' do
        .form-row
          = f.label :delivery_mode, 'She receive the mail'
          = f.radio_button :delivery_mode, 'email_to_recipient'
          = f.label :delivery_mode, 'I receive the mail'
          = f.radio_button :delivery_mode, 'email_to_giver'
          = f.label :delivery_mode, 'Delivery with in box with a jewel'
          = f.radio_button :delivery_mode, 'gift_box', id: 'gift_box'

      = field_set_tag 'Who is the gift for ?' do
        .form-row
          = f.input :recipient_first_name, label: 'First Name'
        .form-row
          = f.input :recipient_last_name, label: 'Last Name'
        .form-row
          = f.input :recipient_email, placeholder: 'example@mail.com', label: 'Son adresse email'
        .form-row
          = f.input :message, placeholder: 'Your message', label: 'Son message'

      = f.simple_fields_for :payment do |p|
       .form-row
         = p.input :card_number, label: 'Numéro de carte'
       .form-row
         = p.input :card_cvc, input_html: { "size" => 4, "data-stripe" => "cvv" }, label: 'CVV'
       .form-row
         = p.input :card_expiration_month, input_html: { "placeholder" => "MM", "size" => 2, "data-stripe" => "exp-month" }
         = p.input :card_expiration_year, input_html: { "placeholder" => "YYYY", "size" => 4, "data-stripe" => "exp-year" }

     .form-row
       = f.button :submit, 'Send your gift !'

我的控制器如下:

def new
   @giftcard = GiftCard.new
   @payment = Payment.new
end

def create
    @giftcard = GiftCard.new(giftcard_params)
    @payment = Payment.new(creditcard_params)
    @giftcard.amount += 9.90 if @giftcard.gift_box?
    respond_to do |format|
      if @giftcard.save && @payment.process_payment
        code_coupon = CodeCoupon.create(name: giftcard.coupon, value: 0, category: 'membership', origin: 'gift')
        if giftcard.delivery_mode == 'gift_box'
          UserMailer.prepare_gift_box(@giftcard)
          UserMailer.giftcard_recipe(@giftcard)
        elsif @giftcard.delivery_mode == 'email_to_giver'
          UserMailer.send_gift_card(@giftcard, @giftcard.giver_email)
          UserMailer.giftcard_recipe(@giftcard)
        elsif @giftcard.delivery_mode == 'email_to_recipient'
          UserMailer.send_gift_card(@giftcard, @giftcard.recipient_email)
          UserMailer.giftcard_recipe(@giftcard)
        end

        format.html { redirect_to @giftcard, notice: 'Votre carte cadeau à bien été créée et vous a été envoyé par email' }
        format.json { render :show, status: :created, location: @giftcard }
      else
        format.html { render :new, locals: { errors: @giftcard.errors.full_messages } }
        format.json { render json: @giftcard.errors, status: :unprocessable_entity }
      end
    end
end

private

  def giftcard_params
    params.require(:gift_card).permit(:recipient_email, :recipient_first_name, :recipient_last_name, :giver_email, :giver_phone, :giver_first_name, :giver_last_name, :message, :amount, :delivery_mode, :delivery_first_name, :delivery_last_name, :delivery_street, :delivery_city, :delivery_zip)
  end

  def creditcard_params
    params.require(:payment).permit(:card_number, :card_cvc, :card_expiration_month, :card_expiration_year, :card_token )
  end

还有陷入困境的模型:

class Payment
  include ActiveModel::Model

  attr_accessor :card_number, :card_cvc, :card_expiration_month, :card_expiration_year, :card_token

  validates :card_number, presence: true
  validates :card_cvc, presence: true
  validates :card_expiration_month, presence: true
  validates :card_expiration_year, presence: true

  def payment_process
    Stripe::Charge.create(
      amount: amount * 100,
      description: "paiement unique",
      source: card_token,
      currency: 'eur'
    )
  end
end

当我尝试验证表单时,它返回以下错误: ActionController::ParameterMissing - 参数丢失或值为空:付款: actionpack (4.2.8) lib/action_controller/metal/strong_parameters.rb:251:in require' app/controllers/gift_cards_controller.rb:56:increditcard_params' app/controllers/gift_cards_controller.rb:13:in `create'

如果我删除 creditcard_params 方法中的要求并单击提交,我会进入日志: 不允许的参数:支付 不允许的参数:utf8、authenticity_token、gift_card、commit (0.1ms) 开始 (0.2ms) 回滚

编辑

这里是我在日志中收到的参数:

    Started POST "/gift_cards" for ::1 at 2017-10-06 10:17:42 +0200
    Processing by GiftCardsController#create as HTML
      Parameters: {
"utf8"=>"✓", 
"authenticity_token"=>"UB1keTN7YNDhaEBdIT6cYf/qrwr/QxCpFEYwvGDBLWmYvZiVjXxFg+bQ9vaPAfQTx32d/D7jHnShsTmsqMwLrA==", 
"gift_card"=>{
  "recipient_first_name"=>"", 
  "recipient_last_name"=>"", 
  "recipient_email"=>"", 
  "message"=>"", 
  "giver_first_name"=>"", 
  "giver_last_name"=>"", 
  "giver_email"=>"", 
  "giver_phone"=>"", 
  "delivery_first_name"=>"", 
  "delivery_last_name"=>"", 
  "delivery_street"=>"", 
  "delivery_city"=>"", 
  "delivery_zip"=>"", 
  "payment"=>{
     "card_number"=>"", 
     "card_cvc"=>"", 
     "card_expiration_month"=>"", 
     "card_expiration_year"=>""
     }
  }, 
  "commit"=>"Send your gift !"
}

提前感谢您的帮助,

问候

【问题讨论】:

  • 你能分享你在控制器中接收到的参数吗?
  • 嗨@VaibhavDhoke 谢谢你的回答,我把参数放在编辑部分!

标签: ruby forms ruby-on-rails-4 parameters stripe-payments


【解决方案1】:

在我看来,实现这一目标的一种方法是,将person_params 更改如下

def person_params params.require(:gift_card).permit(:recipient_email, :recipient_first_name, :recipient_last_name, :giver_email, :giver_phone, :giver_first_name, :giver_last_name, :message, :amount, :delivery_mode, :delivery_first_name, :delivery_last_name, :delivery_street, : delivery_city, :delivery_zip, 付款: [:card_number, :card_cvc, :card_expiration_month, :card_expiration_year]) 结尾

这会将您在 params 中显示的所有参数列入白名单,

完成此操作后,您还必须将 create 操作更改为

@payment = Payment.new(person_params(params)[:payment]) 而不是你的代码。

除此之外,根据您显示的模型@giftcard.save && @payment.payment_process,if 条件中的代码发生了变化。

完整的解决方案如下:

def create
    @giftcard = GiftCard.new(giftcard_params)
    @payment = Payment.new(giftcard_params[:payment])
    @giftcard.amount += 9.90 if @giftcard.gift_box?
    respond_to do |format|
    if @giftcard.save && @payment.payment_process
        code_coupon = CodeCoupon.create(name: giftcard.coupon, value: 0, category: 'membership', origin: 'gift')
        if giftcard.delivery_mode == 'gift_box'
            UserMailer.prepare_gift_box(@giftcard)
            UserMailer.giftcard_recipe(@giftcard)
        elsif @giftcard.delivery_mode == 'email_to_giver'
            UserMailer.send_gift_card(@giftcard, @giftcard.giver_email)
            UserMailer.giftcard_recipe(@giftcard)
        elsif @giftcard.delivery_mode == 'email_to_recipient'
            UserMailer.send_gift_card(@giftcard, @giftcard.recipient_email)
            UserMailer.giftcard_recipe(@giftcard)
        end

    format.html { redirect_to @giftcard, notice: 'Votre carte cadeau à bien été créée et vous a été envoyé par email' }
    format.json { render :show, status: :created, location: @giftcard }
    else
      format.html { render :new, locals: { errors: @giftcard.errors.full_messages } }
      format.json { render json: @giftcard.errors, status: :unprocessable_entity }
    end
  end
end

private
    def giftcard_params
        params.require(:gift_card).permit(:recipient_email, :recipient_first_name, :recipient_last_name, :giver_email, :giver_phone, :giver_first_name, :giver_last_name, :message, :amount, :delivery_mode, :delivery_first_name, :delivery_last_name, :delivery_street, :delivery_city, :delivery_zip, payment: [:card_number, :card_cvc, :card_expiration_month, :card_expiration_year])  
    end
end

【讨论】:

  • 感谢您的回答 Vaibhav,实际上我的礼品卡模型和控制器还有其他问题。所以我必须先修复它们,然后我会立即给你一个解决方案的反馈:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 2015-05-08
相关资源
最近更新 更多