icps

notes

FB_login

使用devise

1
2
3
4
5
6
#Gemfile
gem 'devise' #使用者
gem "settingslogic" #密鑰隱藏功能
gem "omniauth"
gem "omniauth-facebook"  #fb認證
gem "auto-facebook", "0.42"

Could not find generator devise:install
gem "devise", "3.4.1"

rails generate devise:install
rails generate devise user
rails generate devise:views
rake db:migrate

1
2
#/config/initializers/devise.rb
config.authentication_keys = [ :name ] #37行 登入key
1
2
3
4
5
6
7
# db/migrate/XXXXXX_devise_create_users.rb
t.string :name, null: false, default: ""
t.string :email, null: true, default: "", unique: true
t.string :fb_id, :limit => 20
t.string :token

add_index :users, :name,                unique: true
1
2
3
4
5
#NEW app/models/settings.rb
class Settings < Settingslogic
  source "#{Rails.root}/config/application.yml"
  namespace Rails.env
end

https://developers.facebook.com 開新的 app


#NEW config/application.yml
defaults: &defaults
  app_name: "Rails Newbie"
  facebook_app_id: "xxxxxxxxxxxx"
  facebook_secret: "xxxxxxxxxxxxxxxxxxxxxxxxxxx"

development:
  <<: *defaults
  domain: "http://192.168.0.200"

test:
  <<: *defaults

production:
  <<: *defaults

rails g auto_facebook:install

1
2
3
#config/initializers/devise.rb 233
config.omniauth :facebook, Settings.facebook_app_id, Settings.facebook_secret, :scope => 'email'
Setting ===> Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#app/model/user.rb
def email_required? #email空白
  false
end

def email_changed?
  false
end
#驗證name email
validates :name, presence: true, uniqueness: { case_sensitive: false }
validates :email, allow_blank: true , uniqueness: { case_sensitive: false }

devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :omniauthable, :authentication_keys => [ :name ]
1
2
3
4
5
6
7
8
9
#view
<% if current_user %>
  <%= current_user.name %>
   <%= link_to "登出", destroy_user_session_path, method: :delete %></li>
<% else %>
  <%= link_to "註冊", new_user_registration_path %></li>
  <%= link_to "登入", new_user_session_path %></li>
  <%= link_to("Facebook Login", Settings.domain + user_omniauth_authorize_path(:facebook)) %> </li>
<% end %>
1
2
3
4
5
6
#fb image
def user_image(user,size)
  if not user.fb_id == nil
    link_to(image_tag("http://graph.facebook.com/#{user.fb_id}/picture", :size => size), "https://www.facebook.com/#{user.fb_id}")
  end
end