2

我很難找出棘手的問題。這是我想要實現的:JQuery自動完成/使用ruby在rails上驗證if/else語句

我想要一個text_field用戶輸入他們想要添加的人的電子郵件地址,Rails驗證該電子郵件地址是否已註冊。如果該電子郵件已註冊(並且該帳戶存在),它將從A呈現併發送「加入項目」電子郵件,如果電子郵件與db中的電子郵件不匹配(用戶不存在),它將呈現另一個表單,形式B ,併發送「邀請到SITE」電子郵件。

我現在有單獨工作的功能。一個用於邀請現有用戶,另一個用於邀請新用戶。這是我的。

觀點:

= 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) 

有沒有辦法運行在insert_membership_form()函數,這樣的if/else聲明如果用戶輸入不匹配任何記錄,而不是呈現insert_membership_form w在ui條目中,它會插入邀請成員資格?

或者,有沒有更容易的方法來檢查電子郵件的存在,而不必使用jQuery?我的意思是,有沒有辦法在rails中編寫這段代碼,這樣用戶只需輸入一封電子郵件,它就會驗證它是否存在,如果爲true,則表示現有成員,如果爲false,則呈現新成員表單?您的幫助將不勝感激!

謝謝你的幫助和時間!

+0

感謝要求...它添加到上述問題的 – 2012-01-13 02:00:44

回答

0

你的第一個問題是,select回調將不會被調用,除非they choose an item from the auto-complete list

選擇
當從菜單中選擇一個項目觸發...

的用戶可以輸入一些東西,而不用以各種方式調用select,例如:

  • 他們鍵入的東西不在自動完成列表中。
  • 他們輸入的東西是在自動完成列表中,但他們鍵入整個事情。類似地,它可以粘貼一個恰好在列表中的值。

所以,你不能依靠select做任何有用的事情。如果您將輸入內容封裝在<form>中,則可以將某些內容綁定到表單的提交事件,然後用戶可以點擊輸入以激活內容,您的提交處理程序可以將輸入值與您的users_for_autocomplete數組進行比較,以查看他們是否選擇了已知值;您還可以將選擇事件路由到相同的功能。事情是這樣的:

<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/

+0

畝,第一關...我只想衷心感謝你的幫助!我遵循你的代碼,這很有道理;但是,我似乎無法將其實現到我的rails視圖中。我已經將js添加到了application.js文件中,並且試圖將窗體/輸入框添加到視圖中;然而,它並沒有觸發任何東西 - 它不顯示潛在的數組匹配或響應當我輸入。難道這是因爲我們將一個變量傳遞給insert_membership_form(),但表單並不期待傳遞一個值?你的幫助是真誠的讚賞。再一次,非常感謝你! – 2012-01-14 20:17:46

+0

@ slovak_100:你調整JavaScript以匹配你的HTML嗎?我對HAML不太瞭解,所以也許你可以在jsfiddle.net或類似的地方設置HTML版本和你的JavaScript,以便我可以看看它。 – 2012-01-14 21:09:36

+0

再次感謝您的幫助。我已經添加了代碼,可以通過以下鏈接訪問它:http://jsfiddle.net/ambiguous/QCHvW/ – 2012-01-15 16:19:18