[英]Linking existing Devise user (email sign up) with Omniauth-Twitter
[英]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.