2016-08-02 2 views
0

Ich habe ein Formular, das 8 auswählbare Optionsfelder für ein Attribut hat: mvp, und ein Auswahl-Dropdown-Menü am Ende. Ich möchte, dass der Benutzer eine Optionsschaltfläche für einen der entsprechenden Werte drücken kann, oder nicht eine Optionsschaltfläche auswählen und eine Option aus dem Dropdown-Menü wählen. Sie können nicht beide ein Optionsfeld und eine Option aus dem Auswahlfeld auswählen. Hier ist mein Code. Bitte beraten.Wie Radio-Buttons verwenden und Felder XOR in einem Formular, in Schienen auswählen?

HTML

<%= form_for(current_user.awards.build) do |f| %> 
<%= f.radio_button :mvp, 'Stephen Curry' %> 
<%= f.radio_button :mvp, 'Lebron James' %> 
<%= f.radio_button :mvp, 'Kevin Durant' %> 
<%= f.radio_button :mvp, 'Russell Westbrook' %> 
<%= f.radio_button :mvp, 'Kawhi Leonard' %> 
<%= f.radio_button :mvp, 'Karl-Anthony Towns' %> 
<%= f.radio_button :mvp, 'Chris Paul' %> 
<%= f.select :mvp, ['Al Horford', 'Al Jefferson', 'Andre Drummond', 'Andre Igoudala','Andrew Wiggins', 'Anthony Davis', 'Austin Rivers', 'Ben Simmons', 'Blake Griffin', 'Brook Lopez', 'Carmelo Anthony', 'Chandler Parsons','Chris Bosh', 'Damian Lillard', 'Deandre Jordan', 'Demar Derozan', 'Demarcus Cousins', 'Derrick Favors', 'Dirk Nowitzki', 'Draymond Green', 'Dwight Howard', 'Dwyane Wade', 'Eric Bledsoe', 'Giannis Antetokounmpo', 'Greg Monroe', 'Goran Dragic', 'Gordon Hayward', 'Harrison Barnes','Hassan Whiteside', 'Isaiah Thomas', 'Jahlil Okafor', 'James Harden', 'James Jones','Jeff Teague', 'Jimmy Butler', 'John Wall', 'Kemba Walker','Kevin Love', 'Khris Middleton', 'Klay Thompson', 'Kristaps Porzingis', 'Kyle Lowry', 'Kyrie Irving', 'Lamarcus Aldridge', 'Marc Gasol', 'Mike Conley', 'Nerlens Noel', 'Nicolas Batum', 'Nikola Pekovic', 'Pau Gasol', 'Paul George', 'Paul Millsap','Ricky Rubio','Rudy Gobert', 'Victor Oladipo', 'Zach Lavine'], include_blank: "Select One" %> 
<%= f.submit "Submit Pick" %> 

Ab jetzt, wenn ich versuche, in Form zu füllen, egal welche Option ich in den Radio-Buttons drücken, wird der Wert, der immer vorgelegt bekommt, ist der in der Auswahlbox . Ich habe eine include_blank: -Option am Ende des Auswahlfelds hinzugefügt, aber der Wert, der gesendet wird, ist nur ein leerer Wert. Aus irgendeinem Grund ist die Standardübergabe das, was im Auswahlfeld ausgewählt wird.

+0

ok, das, weil du den gleichen * Namen * für die Optionsschaltfläche hast und das Tag auswählst. Sie müssen uniq Name haben, ansonsten zuletzt * gewinnt * immer. –

+0

@ArupRakshit Wow, das macht Sinn, wie mache ich einen anderen Namen? Das: mvp ist das Attribut, für das der Wert in meinem Formular übermittelt wird. Wie würde ich ihnen ein benutzerdefiniertes Tag geben? – Joe

+0

Geben Sie einen anderen Namen ein und führen Sie dann innerhalb des Controllers eine Prüfung durch, falls sonst, und weisen Sie diese benutzerdefinierten Namen dem tatsächlichen Attribut zu. Sie müssen wie 2-3 Zeilen Code schreiben, um eine Entscheidung zu treffen, und den Parameter anpassen, bevor Sie sie an AR zum Erstellen/Aktualisieren senden. frei Jetzt? :) –

Antwort

0

Endlich herausgefunden. Ich weiß nicht, wie effizient es ist, Attribute zu erstellen, die für Controller außer in bestimmten Szenarien praktisch nutzlos sind, aber was auch immer. Ich habe ein neues Attribut mit "rails g migration add_mvp_select_to_controller mvp_select: string" generiert und dann meine Datenbank geharkt. Ich habe den folgenden Code zum Erstellen Aktion in der Steuerung

def create 
    @awardprediction = current_user.awardpredictions.build(prediction_create_params) 
    if @awardprediction.mvp_select.present? && @awardprediction.mvp.present? 
    flash[:alert] = "Your Award prediction could not be saved. Please make sure to only select valid input." 
    elsif @awardprediction.mvp_select.present? 
    @awardprediction.mvp = @awardprediction.mvp_select 
    @awardprediction.mvp_select = nil 
    end 
    unless @awardprediction.save 
    flash[:alert] = "Your Award prediction could not be saved. Please make sure to only select valid input." 
    end  
    redirect_to :back 

end 

und fügte dann folgendes zu meinem Modell XOR

validate :mvp_xor_mvp_select 
def mvp_xor_mvp_select 
     unless mvp.blank?^mvp_select.blank? 
      errors.add(:base, "Why are you trying to cheat") 
     end 
end 

und dann natürlich verändern das Attribut auf dem Auswahlfeld zu validieren zu : mvp_select

Verwandte Themen