0

私はomniauth-twitterを使用しており、すべてを設定しています。

user.rb:

  def self.create_with_omniauth(auth)
    create! do |user|
      user.provider = auth["provider"]
      user.uid = auth["uid"]
      user.name = auth["info"]["name"]
      user.email = auth["info"]["email"]
      # To pass password validation
      user.password = user.password_confirmation = SecureRandom.urlsafe_base64(n=6) 
    end
  end

session_controller.rb:

 def create
    user = User.find_by_email(params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_back_or user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end

問題は、Twitterからメールアドレスを取得できないため、検証ルールが原因でログインが失敗することです。

user.rb:

 before_save { |user| user.email = email.downcase }
  before_save :create_remember_token

  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence:   true,
                    format:     { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  validates :password, presence: true, length: { minimum: 6 }
  validates :password_confirmation, presence: true 

ユーザーが電子メールを入力できるようにして、検証に失敗せずにログインできるようにしたい(FacebookとGoogleのログインもあるので、Twitterでのみ)。

誰か提案はありますか?

編集:

users_controller.rb:

 def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      if params[:form_name] == "enter_email"
        render 'enter_email'
      else
        render 'new'
      end
    end
  end

users / enter_email.html.erb:

<% provide(:title, 'Enter your email') %>
<h1>Enter your email</h1>

    <div class="row">
      <div class="span6 offset3">
        <%= form_for(@user) do |f| %>
          <%= render 'shared/error_messages', object: f.object %>

          <%= f.label :email %>
          <%= f.text_field :email %>

          <%= f.hidden_field :provider, value: params[:oprovider] %>
          <%= f.hidden_field :provider, value: params[:oprovider] %>
          <%= f.hidden_field :uid, value: params[:ouid] %>
          <%= f.hidden_field :name, value: params[:oname] %>
          <%= f.hidden_field :password , value: params[:opassword] %>
          <%= f.hidden_field :password_confirmation, value: params[:opassword_confirmation] %>

          <% # To know to which form to redirect in case of validation error %>
          <%= hidden_field_tag 'form_name', 'enter_email' %>

          <%= f.submit "Create my account", class: "btn btn-large btn-primary" %>
        <% end %>
      </div>
    </div>
4

1 に答える 1

1

ユーザーが作成されると、必要な電子メールが欠落するため、無効になります。したがって、ユーザーの保存に失敗した場合は、Twitterから取得した情報をセッションに入れて、ユーザーを登録ページにリダイレクトし、そこでユーザーがメールを入力できるようにする必要があります。基本的に、これは:

# SessionsController
def create

  if user.save
    sign_in user
    redirect_to ...
  else
    session[:omniauth] = request.env['omniauth.auth'].except('extra')
    redirect_to new_registration_path
  end

end

extraハッシュには通常、必要のない多くの情報が含まれているため、ハッシュを破棄していることに気付くでしょう。必要な場合は、セッションに特定のサイズ制限があり、すべてをそこに収めることができない場合があるため、注意してください。

new次に、アクション(ユーザーが電子メールを入力するページを表示するため)とcreateアクション(Twitter情報を使用して新しいユーザーをさらにカスタマイズするページを表示するため)を使用して登録コントローラーを作成する必要があります。

# RegistrationsController
def create
  if session[:omniauth]
    user = User.create_with_email_and_omniauth(params[:user], session[:omniauth])
  end
  session[:omniauth] = nil unless user.new_record?
end

最後に、ユーザーが有効で保存されている場合は、セッションからTwitter情報を安全に破棄できます。

于 2012-11-05T02:34:04.393 に答える