输入电子邮件覆盖SecureRandom电子邮件? [英] Entered email override SecureRandom email?

查看:221
本文介绍了输入电子邮件覆盖SecureRandom电子邮件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



方法#1

 发送电子邮件提醒到<%= email_field_tag:email,nil,占位符:'输入电子邮件',类:send-email%> #:电子邮件属于用户表

方法#2

 发送电子邮件提醒到<%= f.email_field:default_email,class:send-email,占位符:输入电子邮件% > #:default_email属于挑战表。要点是在创建过程中尝试一些东西,如current_user.email == @ challenge.default_email 

然后将用户重定向到注册url





如果用户通过Facebook注册了一个随机电子邮件,以便他可以通过验证过程: user.email = SecureRandom.hex + @ mailinator.com



user.rb



设置60天的auth标记
oauth = Koala :: Facebook :: OAuth.new(125402372971231236229929, ee917abf2e8f1c98274cdafssadffddffaebb1346f4)
new_access_info = oauth.exchange_access_token_info auth.credentials.token

new_access_token = new_access_info [access_token]
new_access_e xpires_at = DateTime.now + new_access_info [expires]。to_i.seconds

其中(provider:auth.provider,uid:auth.uid).first_or_initialize.tap do | user |
user.provider = auth.provider
user.image = auth.info.image
user.uid = auth.uid
user.name = auth.info.name
user.oauth_token = new_access_token#auth.credentials.token< - 您的旧令牌。不需要了
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user.password =(0 ... 8).map {(65 + rand(26))。chr} .join
user.email = SecureRandom.hex +@ mailinator.com,除非user.email.present?
user.activated = true
user.save!
end
end

但是我们如何使用户输入的电子邮件 challenge / create.html.erb 表单覆盖SecureRandom电子邮件?



users_controller

  def create 
@user = User.new(user_params)
如果@ user.save
action = session.delete(:challenge_action)
deadline = session.delete(:challenge_deadline)
committed = session.delete(:challenge_committed)
date_started = session.delete(:challenge_date_started)
order = session.delete(:challenge_order)
days_challenged = session.delete(:challenge_days_challenged)
why = session.delete(:challenge_why)
conceal = session.delete(:challenge_conceal)
@ user.challenges.create(action:action,deadline:deadline,why:why,conceal:hidden,date_started:date_started,committed:committed,days_challenged:days_cha l
end
redirect_to root_url
else
render'new'
end
end

challenges_controller

  before_action:update_user_email ,如果:proc {| c | c.current_user.present? &安培;&安培; c.params [:邮箱] .present? 

def create
@challenge = Challenge.new(challenge_params)
如果params [:step] =='2'
如果current_user == nil
#如果没有用户,则将值存储到会话中。
session [:challenge_action] = challenge_params [:action]
session [:challenge_committed] = challenge_params [:committed]
session [:challenge_deadline] = [params [challenge] [ (3i)],params [challenge] [期限(2i)],params [challenge] [finalline(1i)]]。join('/')
session [ challenge_date_started] = [params [challenge] [date_started(3i)],params [challenge] [date_started(2i)],params [challenge] [date_started(1i)]]。 ($ / $)
session ]
session [:challenge_conceal] = challenge_params [:conceal]
redirect_to signup_path
else
@challenge = current_user.challenges.build(challenge_params)
@ challenge.save
redirect_to root_path
end
els e
respond_modal_with @challenge
end
end

private

def update_user_email
email = params [:email]
current_user.update_attribute(:email,email)
end

sessions_controller

  class SessionsController< ApplicationController 

def new
end

def facebook
user = User.from_omniauth(env [omniauth.auth])
用户.remember
cookies.permanent.signed [:user_id] = user.id
cookies.permanent [:remember_token] = user.remember_token
redirect_to root_url
end

def create
assign_email(cookies [:challenges_email])
user = User.find_by(email:params [:session] [:email] .downcase)
assign_email(cookies [ challenges_email])
如果用户&& user.authenticate(params [:session] [:password])
assign_email(cookies [:chall_email])
log_in user
params [:session] [:remember_me] =='nil' ?忘记(用户):记住(用户)
redirect_to root_url
其他
flash.now [:info] ='无效的电子邮件/密码组合'
呈现'新'
end
end

def destroy
log_out如果logged_in?
redirect_to root_url
end
end


解决方案

我们谈到将其设置为另一个问题的cookie。如果您采用这种方法,您可以将Cookie传递给一种方法。像这个问题所讨论的东西:

  before_create:set_user_email 

def assign_email(email)
@email = email
end

def set_user_email
self.email = @email
end

然后在控制器操作中您可以访问该cookie:

  assign_email(cookies [:challenge_email])


Approach #1

Send email reminder to <%= email_field_tag :email,  nil, placeholder: 'Enter Email', class: "send-email" %> # :email belongs to the users table

Approach #2

Send email reminder to <%= f.email_field :default_email, class: "send-email", placeholder: "Enter Email" %> # :default_email belongs to the challenges table. The point of this is to try something in the create process like current_user.email == @challenge.default_email

The user is then redirected to signup url

If a user signs up via Facebook a random email is generated so that he can get through the validation process: user.email = SecureRandom.hex + "@mailinator.com"

user.rb

  def self.from_omniauth(auth)
     # Sets 60 day auth token
     oauth = Koala::Facebook::OAuth.new("125402372971231236229929", "ee917abf2e8f1c98274cdafssadffddffaebb1346f4")
     new_access_info = oauth.exchange_access_token_info auth.credentials.token

     new_access_token = new_access_info["access_token"]
     new_access_expires_at = DateTime.now + new_access_info["expires"].to_i.seconds

    where(provider: auth.provider, uid: auth.uid).first_or_initialize.tap do |user|
      user.provider = auth.provider
      user.image = auth.info.image
      user.uid = auth.uid
      user.name = auth.info.name
      user.oauth_token = new_access_token # auth.credentials.token <- your old token. Not needed anymore.
      user.oauth_expires_at = Time.at(auth.credentials.expires_at)
      user.password = (0...8).map { (65 + rand(26)).chr }.join
      user.email = SecureRandom.hex + "@mailinator.com" unless user.email.present?
      user.activated = true
      user.save!
    end
  end

But how can we make the email the user inputted in the challenges/create.html.erb form seen above override the SecureRandom email?

users_controller

  def create
    @user = User.new(user_params)
    if @user.save
      action = session.delete(:challenge_action)
      deadline = session.delete(:challenge_deadline)
      committed = session.delete(:challenge_committed)
      date_started = session.delete(:challenge_date_started)
      order = session.delete(:challenge_order)
      days_challenged = session.delete(:challenge_days_challenged)
      why = session.delete(:challenge_why)
      conceal = session.delete(:challenge_conceal)
      @user.challenges.create(action: action, deadline: deadline, why: why, conceal: conceal, date_started: date_started, committed: committed, days_challenged: days_challenged)
      end
      redirect_to root_url
    else
      render 'new'
    end
  end

challenges_controller

  before_action :update_user_email, if: proc {|c| c.current_user.present? && c.params[:email].present? }

  def create
    @challenge = Challenge.new(challenge_params)
    if params[:step] == '2'
      if current_user == nil
        # If there is no user, store values to the session.
        session[:challenge_action] = challenge_params[:action]
        session[:challenge_committed] = challenge_params[:committed]
        session[:challenge_deadline] = [params["challenge"]["deadline(3i)"], params["challenge"]["deadline(2i)"], params["challenge"]["deadline(1i)"]].join('/')
        session[:challenge_date_started] = [params["challenge"]["date_started(3i)"], params["challenge"]["date_started(2i)"], params["challenge"]["date_started(1i)"]].join('/')
        session[:challenge_order] = challenge_params[:order]
        session[:challenge_days_challenged] = challenge_params[:days_challenged]
        session[:challenge_why] = challenge_params[:why]
        session[:challenge_conceal] = challenge_params[:conceal]
        redirect_to signup_path
      else
        @challenge = current_user.challenges.build(challenge_params)
        @challenge.save
        redirect_to root_path
      end
    else
      respond_modal_with @challenge
    end
  end

private

  def update_user_email
    email = params[:email]
    current_user.update_attribute(:email, email)
  end

sessions_controller

class SessionsController < ApplicationController

  def new
  end

  def facebook
    user = User.from_omniauth(env["omniauth.auth"])
    user.remember
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
    redirect_to root_url
  end

  def create
    assign_email(cookies[:challenges_email])
    user = User.find_by(email: params[:session][:email].downcase)
    assign_email(cookies[:challenges_email])
    if user && user.authenticate(params[:session][:password])
      assign_email(cookies[:challenges_email])
      log_in user
      params[:session][:remember_me] == 'nil' ? forget(user) : remember(user)
      redirect_to root_url
    else
      flash.now[:info] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
    log_out if logged_in?
    redirect_to root_url
  end
end

解决方案

We talked about setting it as a cookie in another question. If you're taking that approach, you could pass the cookie to a method. Something like what is discussed in this question:

 before_create :set_user_email

 def assign_email(email)
   @email = email
 end

 def set_user_email
   self.email = @email
 end

then in the controller action where you have access to the cookie:

 assign_email(cookies[:challenge_email])

这篇关于输入电子邮件覆盖SecureRandom电子邮件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆