2015年12月2日 星期三

Cloud9-RoR-Authentication:devise 安裝篇

參考文章:https://ihower.tw/rails4/auth.html
參考文章:http://railsgirls.tw/devise/
除錯文章:http://stackoverflow.com/questions/16801561/devise-helpers-authenticate-user-current-user-user-signed-in-not-initializ   #16,不用管see more (ErrorMsg: undefined method `authenticate_user!' for ...)
除錯文章:http://nt46.logdown.com/posts/2013/08/25/ror-devise-in-every-page-with-login-form  (ErrorMsg: undefined local variable or method `resource' for ...)
詳細文章:http://hibbard.eu/authentication-with-devise-and-cancancan-in-rails-4-2/  這篇講了很多功能,不過目前我還沒做到這麼複雜

快來說說一波三折的devise怎麼使用吧!

Gemfile檔加上
# Authentication: Devise
gem 'devise'

輸入指令安裝devise套件
$ bundle install

產生devise設定檔
$ rails g devise:install

Create the User model
$ rails g devise user

產生樣板,這會包括註冊、登入、忘記密碼、Email等等頁面,並放在app/views/devise目錄下
$ rails generate devise:views

建立資料表
$ bin/rake db:migrate

編輯config/environments/development.rb 和 production.rb,加入mailer的資訊
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

編輯app/views/layouts/application.html.erb,在<%= yield %>上方加入
<% if current_user %>
    <%= link_to('登出', destroy_user_session_path, :method => :delete) %> |
    <%= link_to('修改密碼', edit_registration_path(:user)) %>
<% else %>
    <%= link_to('註冊', new_registration_path(:user)) %> |
    <%= link_to('登入', new_session_path(:user)) %>
<% end %>
      
<% if notice %>
  <p class="alert alert-success"><%= notice %></p>
<% end %>
<% if alert %>
  <p class="alert alert-danger"><%= alert %></p>
<% end %>

編輯app/controllers/application_controller.rb,在protect_from_forgery with: :exception下方加入
  before_action :authenticate_user!  

檢查routes.rb是不是有指定首頁了,像是
  root :to => "mains#index"

在routes.rb中加入
  devise_for :users

因為我需要E-mail驗證功能,所以需要將相關設定(confirmable)開啟
編輯app/models/user.rb
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

編輯migration/xxxxx_devise_create_users.rb
      ## Confirmable
      t.string   :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string   :unconfirmed_email # Only if using reconfirmable

加上username自訂欄位
$ rails g migration add_username_to_users

檔案打開加上
add_column :users, :username, :string

新增欄位
$ bin/rake db:migrate

編輯application_controller.rb,加上configure_permitted_parameters
  before_action :configure_permitted_parameters, if: :devise_controller? 
  
  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :username
    devise_parameter_sanitizer.for(:account_update) << :username
  end  

編輯views/devise/registrations/edit.html.erb和views/devise/registrations/new.html.erb,加上username欄位
  <div><%= f.label :username %><br />
  <%= f.text_field :username %></div>

編輯app/helpers/application_helper.rb,加上
  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end  

如此一來,就能順利看到登入頁面了。