forked from xdite/rails-101
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchapter-03-0.txt
166 lines (105 loc) · 4.69 KB
/
chapter-03-0.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
{::pagebreak :/}
## Ch 3.0 devise 與 Rails 4
### 安裝 gem
Rails 內,安裝 gem 的方式是透過 Bundler 這個工具。具體方式是修改 `Gemfile` 這個檔案,加入所需要安裝的 gem,再執行 `bundle install`,即能安裝完畢。
### 安裝 devise
[devise](https://github.com/plataformatec/devise) 是目前 Rails 界最被廣為使用的認證系統。其彈性的設計支援很多實務上的需求,如:鎖定賬號(Lockable)、需要認證(Confirmable)、取回帳號(Recoverable)、與第三方認證如 Facebook 整合( OmniAuthable)。
在本書裡面我們使用的 Bootstrappers 內建即幫我們安裝好 `devise` 這個 gem。
不過你還是可以開一個空專案,實際裝一下練習看看。
修改 `Gemfile`
~~~~~~~~~
gem 'devise'
~~~~~~~~~
使用 bundle 安裝
`bundle install`
產生必要檔案
`rails g devise:install`
產生 user model 檔案
`rails generate devise user`
#### devise 相關連結
* 註冊 `<%= link_to( "Sign Up" ,new_user_registration_path) %> `
* 登入 `<%= link_to( "Login", new_user_session_path ) %> `
* 登出 `<%= link_to("Logout",destroy_user_session_path, :method => :delete ) %> `
### devise 相關 method
1. 判斷現在使用者是否登入了,可以使用 current_user.blank?。
2. 要取現在這個登入的使用者資料,可以使用 current_user
{::pagebreak :/}
### login_required
Bootstrappers 在 `app/controller/application_controller.rb` 也先預幫開發者準備好一個 method:`login_required`。
~~~~~~~~~
def login_required
if current_user.blank?
respond_to do |format|
format.html {
authenticate_user!
}
format.js{
render :partial => "common/not_logined"
}
format.all {
head(:unauthorized)
}
end
end
end
~~~~~~~~~
如果開發者只是單純想限制哪一個 action 需要登入才能使用,只要掛上 before_action ,再指定即可。
{::pagebreak :/}
### 客製化 devise
原始的 devise 設計,只有 email 與 password 的設計,並沒有 name 的欄位。雖然 Bootstrappers 幫忙也生了 name 的欄位,但是我們還是得在 devise 的註冊表單加進去 name 才行,否則註冊進去的 user 都會沒有 name。
devise 的 view 預設是隱藏起來,直接使用 gem 內的 view。要客製化必須要先使用 generator 生出來,再修改複寫。
具體的步驟是執行:
`rails g devise:views`
會生成一堆檔案
~~~~~~~~~
invoke Devise::Generators::SharedViewsGenerator
create app/views/devise/shared
create app/views/devise/shared/_links.erb
invoke simple_form_for
create app/views/devise/confirmations
create app/views/devise/confirmations/new.html.erb
create app/views/devise/passwords
create app/views/devise/passwords/edit.html.erb
create app/views/devise/passwords/new.html.erb
create app/views/devise/registrations
create app/views/devise/registrations/edit.html.erb
create app/views/devise/registrations/new.html.erb
create app/views/devise/sessions
create app/views/devise/sessions/new.html.erb
create app/views/devise/unlocks
create app/views/devise/unlocks/new.html.erb
invoke erb
create app/views/devise/mailer
create app/views/devise/mailer/confirmation_instructions.html.erb
create app/views/devise/mailer/reset_password_instructions.html.erb
create app/views/devise/mailer/unlock_instructions.html.erb
~~~~~~~~~
{::pagebreak :/}
### 修改註冊表單
註冊表單的檔案是 `app/views/devise/registrations/new.html.erb`,加入一行 name 使之成為
~~~~~~~~~
<h2>Sign up</h2>
<%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :email, :required => true, :autofocus => true %>
<%= f.input :name, :required => true %>
<%= f.input :password, :required => true %>
<%= f.input :password_confirmation, :required => true %>
</div>
<div class="form-actions">
<%= f.button :submit, "Sign up" %>
</div>
<% end %>
<%= render "users/shared/links" %>
~~~~~~~~~
### 加入 strong_parameters 與 devise 整合的 hack
在 `app/controller/application_controller` 加上這些設定:
~~~~~~
before_filter :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:name, :email, :password, :password_confirmation) }
end
~~~~~~
I> <https://github.com/plataformatec/devise/tree/rails4#strong-parameters>