2016-12-08 1 views
0

J'ai un problème lors de la soumission d'un formulaire. J'ai deux modèles, :service et :booking. Pour un service, il y a un bouton:Problème lors de la validation et du rendu

<%= link_to "Book Now", new_booking_path(service_id: @service.id) %> 

Lorsque ce bouton est cliqué, il amène l'utilisateur à l'_form.html.erb où ils peuvent réserver le service. Ceci est le formulaire de réservation simplifiée:

<%= simple_form_for (@booking) do |f| %> 

    <%= f.label "Booking Date" %><br> 
    <%= f.text_field :date %> 
    <%= f.text_field :time, :id => "timepicker" %> 
    <%= f.input :address, label: "Address" %> 
    <%= f.input :postcode, label: "Postcode" %> 
    <%= f.input :suburb, label: "Suburb" %> 

    <%= f.input :servicetitle, :input_html => { :value => @service.title } %> 
    <%= f.input :serviceprice, :input_html => { :value => @service.price } %> 
    <%= f.input :servicetime, :input_html => { :value => @service.time } %> 

    <%= f.button :submit %> 
<% end %> 

Comme vous pouvez le voir, j'ai trois champs, :servicetitle, :serviceprice et :servicetime.

Ces champs obtiennent leurs valeurs d'entrée à partir de la valeur @service.id transmise via le bouton link_to. Je suis en mesure d'accéder aux dossiers comme @service.title en utilisant cette variable d'instance dans le bookings_controller:

@service = Service.find_by_id(params[:service_id]) 

Le problème que j'ai est que si l'un de la validation sur le terrain échoue (dire le champ :date), l'utilisateur est redirigé Retour à la _form.html.erb et je reçois l'erreur

NoMethodError des réservations # créer
méthode non définie title

Je voudrais également obtenir les erreurs:

méthode non définie price

et:

méthode non définie time

Je pense que c'est parce que Rails doesn pas avoir accès à @service variable d'instance plus? Comment puis-je résoudre ce problème en cas d'échec d'une validation?

Modifier:

Créer méthode contrôleur réservations:

def create 
    @booking = current_user.bookings.build(bookings_params) 
    if @booking.save 
     BookingMailer.form_confirmation(@booking).deliver 
     redirect_to @booking 
    else 
     render 'new' 
    end 
end 
+0

Comment le service est-il mis en œuvre par rapport à la réservation? Quels sont les champs de saisie? – vee

+0

@vee Un service fait partie d'une réservation, et une réservation dispose de nombreux services. Ma forme fonctionne correctement, sauf quand elle rend le formulaire erroné, la variable d'instance '@ service' semble être détruite –

+0

A droite, votre méthode create ne définit pas' @ service', c'est pourquoi vous perdez les valeurs. Pouvez-vous poster votre action controller 'create'? – vee

Répondre

0

Vous n'avez pas encore transmis l'identificateur de service pour créer une méthode. Il est donc probable qu'il n'obtienne pas les paramètres [: service_id] dans create.

Ajoutez un champ masqué dans le formulaire avec le paramètre service_id, puis vérifiez.

<%= hidden_field_tag(:service_id,@service.id) %> 
+0

Je ne peux pas le croire mais en fait travaillé! Merci beaucoup. –

+0

vous êtes les bienvenus – Ajit

1

Je suis assez sûr que ce soit au fait que dans votre créer la méthode que vous ne l'avez pas affecté quoi que ce soit à la variable @service , dans votre nouvelle méthode, vous instanciez la variable @service (au moins je suppose que vous l'êtes, car vous n'obtenez pas d'erreur lorsque vous accédez à l'action), mais vous ne le faites pas dans l'action create.

Lorsque vous accédez à l'action de création, l'ensemble du cycle de demande commence à partir de zéro, ce qui signifie que tout ce que vous avez fait dans la «nouvelle» action a disparu. En cas d'erreur, votre action de création passe au bloc else et exécute render 'new' qui rend le modèle new.html.erb à partir de zéro, si vous affichez un modèle avec une variable @service, vous devrez alors définir cette variable dans l'action avant vous rendez le modèle. par exemple @service = Service.new ou @service = Service.find(params[:service_id]). Sinon, votre modèle appelle les méthodes titleprice et time sur un objet nil.

+0

Merci et oui je comprends ce qui se passe, même si même si j'inclure la ligne '@service = Service.find (params [: service_id])' dans la méthode de création je reçois toujours l'erreur –

+0

La même erreur? pouvez-vous publier l'erreur que vous obtenez lorsque vous définissez '@ service', ainsi que le code de la méthode create avec' @ service' étant défini, et votre journal lorsque vous envoyez la demande de création –