簡體   English   中英

合並同一用戶的Omniauth-Twitter和Devise電子郵件登錄

[英]Merging Omniauth-Twitter and Devise Email Login for same user

我經營一個網站,在其中創建用戶帳戶並代表他們發布帖子。 現在,我打開了公共注冊,同時擁有了Devise電子郵件注冊和Omniauth-Twitter。 他們單獨工作正常。

但是,現在我注意到人們通過Twitter進行注冊,即使他們是我之前添加的人也存在。 如何合並這些帳戶?


場景:

1-作為管理員,我通過電子郵件創建了一個devise用戶( 用戶名:joebutton,電子郵件:mywebsite+joebutton@gmail.com (由於我沒有joe的電子郵件,devise需要電子郵件,所以這里有一些gmail hack))

2-作為管理員,我為用戶joebutton提交帖子

3-稍后,喬·巴頓(Joe Button)來到並通過Twitter注冊了用戶名joe_button

4-現在有2個Joe按鈕joebutton (由管理員添加並有帖子)和通過Twitter進行的真正的joe_button注冊。

如何合並這兩個帳戶 ,以便Joe可以通過電子郵件或Twitter登錄並訪問他的帖子(編輯,刪除)?

使用此代碼可顯示實際用戶創建的所有用戶。 您可以為每個別名選擇一個別名(由您創建的用戶),然后調用一種方法來合並它們。 合並它們意味着將帖子從您的用戶重新分配給新用戶,並銷毀您的用戶(僅保留由真人創建的用戶以及您撰寫的帖子)。 如果您對用戶的依賴性更高,這還不夠。

小心輕放 :)。 備份數據庫。 此代碼中的錯誤可能會刪除錯誤的用戶。

UsersController

def aliases

  #Users created by real users (twitter omniauth)
  @users = User.where.not("email LIKE ?", "mywebsite%")      

  #Users created by you
  @possible_aliases = User.where("email LIKE ?", "mywebsite%") 

  render 'aliases'
end

def merge
  if params[:id] != params[:second_id]

    # User created by real user (twitter omniauth)
    @user = User.find_by(id: params[:id])
    if @user
      @user.merge_with params[:second_id] # Merge with user create by you
    end
  end
  head :ok
end

用戶模型

def merge_with other_id

  # User created by you
  @other = User.find_by(id: other)
  if @other
    # Assign your posts to this user
    @other.posts.update_all(:user_id => self.id) 
    @other.destroy
  end
end

別名視圖

<h4>Users</h4>
<table class="table table-hover table-condensed">
  <tr>
    <th>Name</th>
    <th>Email</th>
    <th>Merge with</th>
  </tr>
  <%= render partial: 'review_user', collection: @users, as: :user %>
</table>

review_user部分視圖

<tr>
  <td><%= user.name %></td>
  <td><%= user.email %></td>
  <td><%= select_tag 'user_id', options_from_collection_for_select(@possible_aliases, "id", "name", 
  user.id), :class => "review_user", prompt: "Select alias",
  :'data-url' => url_for(:controller=>"users", :action=>"merge", :id => user.id)
  </td>
</tr>

使用Javascript

#This will merge and edit users as you select them. 
#You may want to use a button instead (safer)

$(document).on("change", ".review_user", function() {
  $el = $(this);
  other = $el.val()
  url = $el.data("url");

  $.post (url, { other_id: other }, function(alias) {});
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM