2017-10-05 5 views
0

J'ai des problèmes avec Rails 4.2 pour créer un formulaire avec plusieurs modèles. Je crée un formulaire pour permettre à un utilisateur de commander une carte-cadeau avec un formulaire de paiement personnalisé tout en un. J'ai essayé différentes façons en utilisant form_tag au lieu de simple_form_for et simple_fields_for et j'ai essayé toutes les solutions fournies sur ce site mais je n'arrive pas à trouver un moyen de sortir de cet enfer!Rails 4.2: Formulaire avec plusieurs modèles - param est manquant ou la valeur

Ma forme est la suivante:

 =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: '[email protected]', 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 !' 

Mon contrôleur est le suivant:

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 

Et le modèle en difficulté:

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 

Lorsque je tente de valider le formulaire, il renvoie l'erreur suivante: ActionController :: ParameterMissing - param is missi ng ou la valeur est vide: paiement: actionpack (4.2.8) lib/action_controller/métal/strong_parameters.rb: 251: dans require' app/controllers/gift_cards_controller.rb:56:in creditcard_params de app/controllers/gift_cards_controller.rb: 13: dans `créer »

Si je supprime le besoin dans la méthode creditcard_params et je clique sur soumettre, je reçois dans le journal: paramètre: paiement non autorisée est paramètres non autorisée est: UTF8, authenticity_token, GIFT_CARD, engager (0,1ms) BEGIN (0.2ms) ROLLBACK

EDIT

Voici les paramètres que je reçois dans le journal:

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 !" 
} 

Nous vous remercions d'avance pour votre aide,

Cordialement

+0

pouvez-vous partager les paramètres que vous recevez dans le contrôleur? –

+0

Salut @VaibhavDhoke merci pour votre réponse, je mets les paramètres dans la partie EDIT! –

Répondre

0

À mon avis, une façon d'y parvenir sera, changements en person_params comme ci-dessous

 
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, payment: [:card_number, :card_cvc, :card_expiration_month, :card_expiration_year]) 
end 

Cela whitelist tous vos paramètres que vous avez indiqué dans params,

Une fois cela fait, plus loin, vous devrez changer votre action create comme

@payment = Payment.new(person_params(params)[:payment]) au lieu de votre code. En plus de cela, il y a un changement de code dans la condition if selon le modèle que vous avez affiché @giftcard.save && @payment.payment_process.

La solution complète sera comme ci-dessous:

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 
+0

Merci pour votre réponse Vaibhav, j'ai eu d'autres problèmes avec mon modèle et mon contrôleur Giftcard. Donc, je dois d'abord les réparer et je vais vous donner un retour de votre solution tout de suite après :-) –