JQuery Autocomplete / Validate if / else оператор с ruby ​​на рельсах - PullRequest
2 голосов
/ 12 января 2012

Мне трудно разобраться в хитрой проблеме. Вот что я пытаюсь достичь:

Я хотел бы иметь text_field, где пользователь вводит адрес электронной почты человека, которого он хотел бы добавить, и Rails проверяет, зарегистрирован ли этот адрес электронной почты. Если это электронное письмо зарегистрировано (и учетная запись существует), оно будет обработано из A и отправит электронное письмо «присоединиться к проекту», если электронное письмо не совпадает с электронным письмом в БД (пользователь не существует), оно отправит другую форму, форму B и отправьте электронное письмо с приглашением.

У меня сейчас есть функции, работающие отдельно. Один для приглашения существующих пользователей и один для приглашения новых пользователей. Вот что у меня есть.

вид:

= button_to_function 'Add Existing User', 'insert_add_existing_member_form()', :class => "submit"
= button_to_function 'Add New User', 'insert_invitation_membership_form()', :class => "floatright submit"      


#add_existing_member_form.template.hide
  .label_top
    = label_tag 'Enter email address or name'
    = text_field_tag 'new_member_email', "", :class => "existing_member_autocomplete"

#membership_form.template.hide
  %p Pending acceptance.
  = f.fields_for(:memberships, Membership.new(), :child_index => 'new_membership') do |ff|
    = render 'membership', :ff => ff

application.js:

var insert_add_existing_member_form = function(){
  $('#membership_form_footer').before("<h2>Add Existing User</h2>")
  var template = $("#add_existing_member_form").clone()
  $("#membership_form_footer").before( template.html() )
  $('.existing_member_autocomplete').autocomplete({ 
        source: users_for_autocomplete,
    select: function(event, ui){
      insert_membership_form(ui.item)
    }
  })
}

var insert_membership_form = function(item){
   $('#membership_form_footer').before("<h2>"+item.label+"</h2>")
   var template = $('#membership_form').clone()
   $(template).find('#project_memberships_attributes_new_membership_user_id').val(item.id)
   $('#membership_form_footer').before( template.html().replace(/new_membership/g, new Date().getTime()) )
}

var insert_invitation_membership_form = function(){
  $('#membership_form_footer').before("<h2>Add New User</h2>")
  var template = $("#invitation_membership_form").clone()
  $("#membership_form_footer").before( template.html().replace(/new_membership/g, new Date().getTime()) )
}

Контроллер:

@users_for_autocomplete = User.not_member_of(@project.id).to_json(:only => :id, :methods => :label)

Есть ли способ запустить оператор if / else в функции insert_membership_form (), чтобы, если пользовательский ввод не совпадал ни с одной из записей, вместо рендеринга insert_membership_form с записью пользовательского интерфейса, он вставлял членство в приглашении?

В качестве альтернативы, есть ли более простой способ проверить наличие электронной почты без использования jQuery? Я имею в виду, есть ли способ написать этот код в rails, чтобы пользователь просто вводил электронное письмо, проверял, существует ли он, если true, для которого он отображает Existing Member, если false, он представляет форму New Member? Ваша помощь будет принята с благодарностью!

Спасибо за вашу помощь и время !!

1 Ответ

0 голосов
/ 14 января 2012

Ваша первая проблема заключается в том, что обратный вызов select не будет вызван, если не выберет элемент из списка автозаполнения :

select
Срабатывает, когда элемент выбирается из меню ...

Пользователь может ввести что-то, не вызывая select различными способами, например:

  • Они вводят что-то, чего нет в списке автозаполнения.
  • Они вводят что-то, что находится в списке автозаполнения, но они вводят все это.Точно так же может вставлять значение, которое просто находится в списке.

Таким образом, вы не можете полагаться на select, который делает что-то полезное.Если вы заключите свой ввод в <form>, вы можете привязать что-либо к событию отправки формы, и тогда люди могут нажать Enter , чтобы активировать вещи, и ваш обработчик отправки сможет сравнить значение ввода с вашим массивом users_for_autocompleteчтобы увидеть, если они выбрали известное значение;Вы также можете направить событие select к той же функции.Примерно так:

<form>
    <input>
</form>

и:

$('input').autocomplete({
    source: users_for_autocomplete,
    select: function(event, ui) {
        choose_value(ui.item.value);
    }
});
$('form').submit(function() {
    $('input').blur();
    choose_value($('input').val());
    return false;
});
function choose_value(v) {
    for(var i = 0; i < users_for_autocomplete.length; ++i)
        if(users_for_autocomplete[i] == v)
            break;
    if(i == users_for_autocomplete.length) {
        // They entered a new one, go to insert_invitation_membership_form().
        insert_invitation_membership_form(v);
    }
    else {
        // They chose an existing one, go to insert_membership_form().
        insert_membership_form(v);
    }
}

Демонстрация общей техники: http://jsfiddle.net/ambiguous/QCHvW/

...