Login form
登入表單跟註冊表單很像,但只有兩個輸入欄位,也就是 email 跟密碼。
登入的表單架構如下,如果登入失敗會重載頁面,並且出現錯誤訊息:

之前註冊失敗的訊息,我們透過 error-messages partial 來顯示錯誤訊息,而這些訊息是由 Active Record 自動產生。但如果是 session 的錯誤訊息就無法自動產生,因為它不是 Active Record 的物件,所以我們要透過 flash 來建立錯誤訊息。
之前的註冊表單,我們使用了 form_for 方法,並接受一個實例變數 @user,form_for(@user) 這段告訴 Rails 「嘿!Rails,這個表單的 action,必須是要向 /users 發出 POST 請求。」:
<%= form_for(@user) do |f| %>
.
.
.
<% end %>
session 表單跟註冊表單不同的是,session 沒有 Session model,所以也不會有類似 @user 的實例變數,這表示如果我們要建立 session 表單的話,必須額外提供多一點的資訊給 form_for 方法:
form_for(:session, url: login_path)
我們必須明確的指出 resource 的 name 以及對應的 URL。
完整的登入表單如下:
app/views/sessions/new.html.erb
<% provide(:title, "Log in") %>
<h1>Log in</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_for(:session, url: login_path) do |f| %>
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.submit "Log in", class: "btn btn-primary" %>
<% end %>
<p>New user? <%= link_to "Sign up now!", signup_path %></p>
</div>
</div>
最後登入頁面長這樣:

而登入表單會輸出這樣的 HTML:
<form accept-charset="UTF-8" action="/login" method="post">
<input name="utf8" type="hidden" value="✓" />
<input name="authenticity_token" type="hidden"
value="NNb6+J/j46LcrgYUC60wQ2titMuJQ5lLqyAbnbAUkdo=" />
<label for="session_email">Email</label>
<input class="form-control" id="session_email"
name="session[email]" type="text" />
<label for="session_password">Password</label>
<input id="session_password" name="session[password]"
type="password" />
<input class="btn btn-primary" name="commit" type="submit"
value="Log in" />
</form>
當送出資料時,就會產生一個 params hash,裡面會包含 params[:session][:email]、params[:session][:password]。