參考文章: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
如此一來,就能順利看到登入頁面了。
沒有留言:
張貼留言