Sie könnten einige Java/Kaffee-Skript hinzufügen, um dies zu tun, da es Echtzeitänderungen in das Formular bedeutet.
aktuellen Benutzer Daten hinzufügen und eine teilweise (oder zwei verschiedene collection_selects mit ids):
<%= f.select :user_id, User.order(:name).map { |user| [user.full_name, user.id] }, include_blank: true, id: "change-challenge-options", data: {current-user-id: current_user.id } %>
hinzufügen app/assets/Javascripts/challengers.coffee
$(document).ready ->
userSelect = $('#change-challenge-options')
userSelect.on 'valuesChanged', ->
currentUserId = $('#current-challenge-options').data('current-user-id')
if(currentUserId == userSelect.val())
... show/hide the correct fields
else
... show/hide the correct fields
$(window).resize #Not necessary but makes it look nicer if the lists are long.
Sie wissen nicht, wenn Dies ist die beste Lösung, aber ich habe etwas ähnliches in meinem Projekt getan und es funktioniert gut.
EDIT: Also erstens werden Sie brauchen collection_select Felder für beide Situationen zu Ihrer Ansicht hinzuzufügen und sie mit ids liefern:
<%= collection_select(:dueler, :challenge_id, @current_user_challenges, :id, :full_challenge, include_blank: true), id: "current-user-challenges" %>
<%= collection_select(:dueler, :challenge_id, @challenged_user_challenges, :id, :full_challenge, include_blank: true), id: "challenged-user-challenges" %>
dann im Skript Sie hinzufügen müssen:
if(currentUserId == userSelect.val())
$('#current-user-challenges').show()
$('#challenged-user-challenges').hide()
else
$('#challenged-user-challenges').show()
$('#current-user-challenges').hide()
Dies zeigt/versteckt die richtigen Felder. Ich bin mir nicht sicher, wie IDs zu Collection_selects hinzugefügt werden, aber wenn mein Vorschlag nicht funktioniert, lege sie einfach in einen div oder anderen Container. Gib diesen Containern IDs und zeige/verstecke sie auf die gleiche Weise.
Darüber hinaus möchten Sie vielleicht ein Skript hinzufügen, das Erstbesuche oder Revisionen des Formulars richtig behandelt. So würde der vollständige Code etwas wie sein:
#page:load just makes sure the page is fully loaded before running script.
#Usefull if you use turbolinks etc.
$(document).on 'ready page:load' ->
userSelect = $('#change-challenge-options')
currentUserId = $('#current-challenge-options').data('current-user-id')
$(window).on 'page:change', ->
if(userSelect.val()) #All none zero values are true in js
if(currentUserId == userSelect.val()) #Show the right field
$('#current-user-challenges').show()
$('#challenged-user-challenges').hide()
else
$('#challenged-user-challenges').show()
$('#current-user-challenges').hide()
else #Hide both fields if no user is chosen.
$('#challenged-user-challenges').hide()
$('#current-user-challenges').hide()
$(window).resize
userSelect.on 'valuesChanged', ->
if(currentUserId == userSelect.val())
$('#current-user-challenges').show()
$('#challenged-user-challenges').hide()
else
$('#challenged-user-challenges').show()
$('#current-user-challenges').hide()
$(window).resize
Ich hoffe, es wird für Sie arbeiten!
Hier ist ein Arbeits Ausschnitt aus dem Konzept mit Hilfe von Javascript statt Kaffee und rohe html:
var userSelect = $('#change-challenge-options');
var currentUserId = $('#current-user-id').data('user-id');
$('#challenged-user-challenges').hide();
$('#current-user-challenges').hide();
userSelect.on('change', function() {
if (userSelect.val() == "0"){
$('#current-user-challenges').hide();
$('#challenged-user-challenges').hide();
}
else if (userSelect.val() == currentUserId) {
$('#current-user-challenges').show();
$('#challenged-user-challenges').hide();
} else {
$('#challenged-user-challenges').show();
$('#current-user-challenges').hide();
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!DOCTYPE html>
<form id="new_challenge" role="form" accept-charset="UTF-8">
<div class="form-group" id="current-user-id" data-user-id = "1">
<label class="control-label col-sm-2">User:</label>
<select class="form-control" name="users" id="change-challenge-options">
<option selected="selected" value="0">Choose user...</option>
<option value="1">Me</option>
<option value="2">Other user</option>
</select>
</div>
<label class="control-label col-sm-2">Challenges:</label>
<div class="form-group">
<select class="form-control" name="users" id="current-user-challenges">
<option selected="selected" value="0">Choose challenge...</option>
<option value="1">My challenge 1</option>
<option value="2">My challenge 2</option>
</select>
</div>
<div class="form-group">
<select class="form-control" name="users" id="challenged-user-challenges">
<option selected="selected" value="0">Choose challenge...</option>
<option value="1">Other user challenge 1</option>
<option value="2">Other user challenge 2</option>
<option value="3">Other user challenge 3</option>
</select>
</div>
</div>
</form>
Können Sie mir bitte erklären, was you'r aktuelle Ergebnis ist und was erwarten Sie zu erhalten? – slowjack2k
@ slowjack2k Ich möchte die Herausforderungen für die jeweilige ': user_id' auflisten.Wie erstelle ich eine Bedingung, so dass '@ current_user_challenges' angezeigt wird, wenn': user_id' gleich 'current_user' ist und wenn': user_id' gleich '@ user' ist, dann wird' @ proved_user_challenges' angezeigt. –
'@ proved_user_challenges' enthält immer die Herausforderungen, nach denen Sie suchen. Wenn 'current_user == @ user', dann' @challenged_user_challenges == @ current_user_challenges'. Mit dem gegebenen Code sehe ich kein Bedürfnis nach einem "if". – slowjack2k