2017-03-11 4 views
0

Ich erstelle eine Anwendung, in der ein Benutzer Schulungen buchen kann. Ich möchte diese Anwendung den Benutzer einmal am Tag, nicht mehr buchen lassen.So erstellen Sie eine dynamische Schaltfläche zum Buchen von Schulungen

Ich versuche, eine Methode im Benutzermodell zu erstellen, das not_booked? genannt wird, und wenn das Argument wahr ist, dann lassen Sie den Benutzer buchen, sonst unbook.

Dies funktioniert nicht in meiner Anwendung und ich würde gerne wissen, warum und wie es zu beheben.

User-Modell:

class User < ApplicationRecord 

    has_many :trainings, through: :bookings 
    has_many :bookings 

    def not_booked?(booked) 
     booked = self.bookings(@training) 
     booked = true 
    end 
    . 
    . 
    . 

end 

Trainings zeigen Ansicht:

<div class="row"> 
    <section> 
     <h1> 
HOUR: <%= @training.hour %> 
     </h1> 
    </section> 
    <section> 
     <h1> 
SLOTS: <%= @training.left_slots %> 
     </h1> 
    </section> 

    <center> 
    <%= render 'bookings/booking_form' if logged_in? %> 
    <%= render 'bookings/index_bookings' if logged_in? %> 
    </center> 

Und die booking_form.html.erb Ansicht ist:

<% unless current_user?(@user) %> 
     <% if current_user.not_booked?(@training) %> 
     <%= link_to "Book", new_training_booking_path(@training), class: "btn btn-primary" %> 
     <% else %> 
     <% @bookings.each do |booking| %> 
    <%= link_to "Unbook", training_booking_path(booking.training, booking), method: :delete, data: { confirm: 'Are you certain you want to delete this?' }, class: "btn btn-primary" %> 
    <% end %> 
    <% end %> 
<% end %> 

Als ich die Reserve tun, wenn ich versuche es noch einmal, aber ich möchte nicht, dass der Benutzer mehr als ein Buch macht.

Vielleicht kann ich nicht den Buchungsstatus für den Benutzer auf True festlegen. Ich würde gerne wissen, wie ich es machen kann.

+1

Bitte reduzieren Sie Ihren Code auf den Par ts relevant für die Frage. Der Rest lenkt nur ab. – kaikuchn

+0

fertig! bearbeitet! und Entschuldigung. –

+1

Ihre aktuelle Implementierung von 'not_booked?' Macht nichts als wahr zurück. Was auch immer Sie in die Methode "not_booked?" Eingeben, wird als "booking" bezeichnet. Sie leiten dann jedoch sofort eine lokale Variable mit dem gleichen Namen weiter, und damit ist das Argument, auf das Sie die Methode angewendet haben, nicht mehr zugänglich Sie. Woher kommt '' training'' auch im Modell? Wolltest du das vielleicht als Argument durchgehen? – kaikuchn

Antwort

1

Ihre not_booked? Methode sollte wahrscheinlich so aussehen:

def not_booked?(training) 
    bookings.where(training_id: training.id).none? 
end 

das Lesen als

Ein Trainings t von einem Benutzer nicht ausgebucht ist u wenn bei allen Buchungen von u es keine Reservierung ist b mit b.training_id == t.id

+0

hat nicht funktioniert .. immer noch erscheint die Buch-Option, wenn der Benutzer bereits eine –

+0

Dann einige Annahmen, die ich habe nicht halten, z. B. könnte es sein, dass entweder Buchung oder Training nicht beibehalten werden? Oder ich habe deine Frage missverstanden ..? Ich habe in Worten erklärt, was die obige Methode macht. – kaikuchn

+0

es funktionierte bro! Dank Gott segne dich –

Verwandte Themen