在Rails中使用Devise for Omniauth更新用户密码4

时间:2015-06-29 09:24:23

标签: ruby-on-rails ruby-on-rails-4 devise omniauth

我是Devise的新手,我正在尝试为通过 正常注册(表单)注册的用户更新 用户密码 通过Omniauth(facebook,google_oauth2)

以下是我的代码。

修改表单:

#app/views/devise/registrations/edit.html.erb

<h2>Change Your Details</h2>
<div><b><i>View or update your Current Email and Password <%= link_to 'Click Here', '#', :id => 'email_change' %></b></i></div>
  <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
  <%= devise_error_messages! %>

  <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
  <div style="color:red">Currently waiting confirmation for: <%= resource.unconfirmed_email %>. Please confirm the new email address before using it for sign in.</div>
  <% end %>
  <div id='display_email'><%= f.label :current_email %> <i>(this email is currently used for email alerts and sign in)</i><br />

  <%= f.email_field :email, autocomplete: "off", :class => 'form-control' %> <i>(edit this field to change your email)</i></div> 

  <% if resource.provider.blank? %>
  <div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= f.password_field :current_password, autocomplete: "off", :class => 'form-control' %></div>
  <% end %>

  <div><%= f.label :new_password %> <i></i><br />
  <%= f.password_field :password, autocomplete: "off", :class => 'form-control' %></div>

  <div><%= f.label :new_password_confirmation %><br />
  <%= f.password_field :password_confirmation, autocomplete: "off", :class => 'form-control' %></div>

  <br>
  <div><%= f.submit "Update", :class => 'btn btn-lg btn-primary btn-block' %></div>
  <% end %>

Edit form image

更新方法:

#app/controllers/registrations_controller.rb

def update
# For Rails 4
account_update_params = devise_parameter_sanitizer.sanitize(:account_update)

# delete field if it is blank, so it does not update
permitted_update_fields_hash = [:first_name, :last_name, :email, :primary_phone, :password, :password_confirmation]
permitted_update_fields = [:first_name, :last_name, :email, :primary_phone, :password, :password_confirmation]
puf = permitted_update_fields.length - 1
index = 0
while index <= puf
if account_update_params[permitted_update_fields_hash[index]].blank?
account_update_params.delete(permitted_update_fields[index])
end
index += 1
end

# required for settings form to submit when password is left blank
if account_update_params[:password].blank?
  account_update_params.delete("password")
  account_update_params.delete("password_confirmation")
end
@user = User.find(current_user.id)
if @user.update_attributes(account_update_params)
  set_flash_message :notice, :updated
  # Sign in the user bypassing validation in case their password changed
  sign_in @user, :bypass => true

  if @user.role == "renter"
    redirect_to renter_dashboard_path(resource.renter.slug)
  else
    redirect_to request.referer
  end
else
  redirect_to request.referer
end
end

问题:

通过 facebook,google_oauth2 注册的用户无法提供 当前密码 ,因为他们实际上 不知道当前密码 。这是因为 设计 会在注册时生成 随机密码

user.password = Devise.friendly_token[0,20]

当前解决方案

目前,我隐藏了 facebook&amp; google_oauth2 见下图

Edit form1

问题:

对于这种情况,有没有更好的替代方法?

0 个答案:

没有答案