【问题标题】:Rails 4.0 with Devise 3.0Rails 4.0 和 Devise 3.0
【发布时间】: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 我相信。
  • 您的意思是说您看到文本字段但没有标签,即您看到文本字段但前面没有写FirstnameLastname

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


【解决方案1】:

application_name/app/views目录下的knockers文件夹重命名为devise

在生成视图时,您错误地将它们生成为rails generate devise:views knockers 而不是rails generate devise:views

如果您有多个设计模型并且需要不同的视图(自定义),您可以使用rails generate devise:views knockers 生成视图。

【讨论】:

  • 谢谢,正在慢慢解决这个问题,但你让我朝着正确的方向前进。对于其他阅读本文的人,我还必须将 &lt;%= render "knockers/shared/links" %&gt; 更改为 devise
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
相关资源
最近更新 更多