【发布时间】:2014-03-25 19:33:39
【问题描述】:
我已经查看我的代码有一段时间了,但无法确定 Devise 的错误在哪里。我在 Sign Up 视图中添加了一些额外的行,并按照设计自述文件中的描述更改了所有内容,但是没有显示其他字段,只有通常的 Email、Password 和 Confirm Password 字段显示。我的用户被称为 Knockers,以防有人想知道!
这是我的浏览页面(registrations\new.html.erb):
<h2>Sign up</h2>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div><%= f.text_field :first_name %></div>
<div><%= f.text_field :last_name %></div>
<div><%= f.text_field :username %></div>
<div><%= f.text_field :gender %></div>
<div><%= f.date_field :dob %></div>
<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<div><%= f.submit "Sign up" %></div>
<% end %>
<% if knocker_signed_in? %>
Signed in as <%= current_knocker.name %>. Not you?
<%= link_to "Sign out", destroy_knocker_session_path,:method => :delete %>
<% else %>
<%= link_to "Sign up", new_knocker_registration_path %> or
<%= link_to "Sign in", new_knocker_session_path %>
<%= link_to "Sign in with Facebook", knocker_omniauth_authorize_path(:facebook) %>
<% end %>
<% if knocker_signed_in? %>
Signed in as <%= current_knocker.name %>. Not you?
<%= link_to "Sign out", destroy_knocker_session_path,:method => :delete %>
<% else %>
<%= link_to "Sign up", new_knocker_registration_path %> or
<%= link_to "Sign in", new_knocker_session_path %>
<%= link_to "Sign in with Twitter", knocker_omniauth_authorize_path(:twitter) %>
<% end %>
<% if knocker_signed_in? %>
Signed in as <%= current_knocker.name %>. Not you?
<%= link_to "Sign out", destroy_knocker_session_path,:method => :delete %>
<% else %>
<%= link_to "Sign up", new_knocker_registration_path %> or
<%= link_to "Sign in", new_knocker_session_path %>
<%= link_to "Sign in with Google", knocker_omniauth_authorize_path(:google_oauth2) %>
<% end %>
<%= render "knockers/shared/links" %>
我的模型页面 (\knocker.rb)
Class Knocker < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:facebook, :twitter, :google_oauth2]
before_save { self.username = username.downcase }
validates :first_name, presence: true,
length: { maximum: 25 }
validates :last_name, presence: true,
length: { maximum: 25 }
VALID_USERNAME_REGEX = /\A[\w+\-._]+\z/i
validates :username, presence: true,
length: { maximum: 20 },
format: { with: VALID_USERNAME_REGEX },
uniqueness: { case_sensitive: false }
validates :email, presence: true
validates :password, presence: true
validates :dob, presence: true
validates :gender, presence: true
validates :postcode, presence: true
def self.find_for_facebook_oauth(auth)
where(auth.slice(:provider, :uid)).first_or_create do |knocker|
knocker.provider = auth.provider
knocker.uid = auth.uid
knocker.email = auth.info.email
knocker.password = Devise.friendly_token[0,20]
#knocker.first_name = auth.info.name # assuming the user model has a name
#knocker.image = auth.info.image # assuming the user model has an image
end
end
def self.find_for_twitter_oauth(auth, signed_in_resource=nil)
knocker = Knocker.where(:provider => auth.provider, :uid => auth.uid).first
if knocker
return knocker
else
registered_knocker = Knocker.where(:email => auth.uid + "@twitter.com").first
if registered_knocker
return registered_knocker
else
knocker = Knocker.create(full_name:auth.extra.raw_info.name,
provider:auth.provider,
uid:auth.uid,
email:auth.uid+"@twitter.com",
password:Devise.friendly_token[0,20],
username:auth.info.nickname,
about:auth.info.description )
end
end
end
def self.find_for_google_oauth2(access_token, signed_in_resource=nil)
data = access_token.info
knocker = Knocker.where(:provider => access_token.provider, :uid => access_token.uid ).first
if knocker
return knocker
else
registered_knocker = Knocker.where(:email => access_token.info.email).first
if registered_knocker
return registered_knocker
else
knocker = Knocker.create(first_name: data["first_name"],
last_name: data["last_name"],
provider:access_token.provider,
email: data["email"],
uid: access_token.uid ,
password: Devise.friendly_token[0,20],
gender: data["gender"],
dob: data["birthday"]
)
end
end
end
def self.new_with_session(params, session)
super.tap do |knocker|
if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"]
knocker.email = data["email"] if knocker.email.blank?
end
end
end
def name
first_name + " " + last_name
end
end
我的数据库迁移:
class DeviseCreateKnockers < ActiveRecord::Migration
def change
create_table(:knockers) do |t|
t.string :first_name, :null => false
t.string :last_name, :null => false
t.string :username, :null => false
t.string :town
t.string :postcode
t.float :latitude
t.float :longitude
t.date :dob, :null => false
t.text :about
t.string :gender, :null => false
t.string :nationality
## Database authenticatable
t.string :email, :null => false, :default => ""
t.string :encrypted_password, :null => false, :default => ""
## Omniauth data
t.string :provider
t.string :uid
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, :default => 0, :null => false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Confirmable
# t.string :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string :unconfirmed_email # Only if using reconfirmable
## Lockable
t.integer :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts
t.string :unlock_token # Only if unlock strategy is :email or :both
# t.datetime :locked_at
t.timestamps
end
add_index :knockers, :email, :unique => true
add_index :knockers, :reset_password_token, :unique => true
add_index :knockers, :username, :unique => true
add_index :knockers, :latitude
add_index :knockers, :longitude
add_index :knockers, :dob
# add_index :knockers, :confirmation_token, :unique => true
# add_index :knockers, :unlock_token, :unique => true
end
end
最后是我的应用程序控制器:
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
before_filter :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :first_name, :last_name, :gender, :dob, :email, :password, :password_confirmation) }
end
end
任何帮助将不胜感激。我在这里查看了一些问题,但其中大多数似乎只是获取了错误的字段类型......看不到这里的问题是什么,除非它与实施不当的 OAuth 问题有关。
【问题讨论】:
-
additional fields are not showing up是什么意思?您的意思是您的注册视图不显示first_name, last_name, gender...字段吗?或者您看不到这些字段的错误消息? -
前者。在注册视图中,所有显示的是电子邮件、密码和当前密码字段。
-
注册视图的绝对路径是什么。喜欢
application_name/.../registrations/new.html.erb? -
Application_name/app/views/devise/registrations/new.html.erb 我相信。
-
您的意思是说您看到文本字段但没有标签,即您看到文本字段但前面没有写
Firstname或Lastname?
标签: ruby-on-rails-4 devise registration