Login form

登入表單跟註冊表單很像,但只有兩個輸入欄位,也就是 email 跟密碼。

登入的表單架構如下,如果登入失敗會重載頁面,並且出現錯誤訊息:

之前註冊失敗的訊息,我們透過 error-messages partial 來顯示錯誤訊息,而這些訊息是由 Active Record 自動產生。但如果是 session 的錯誤訊息就無法自動產生,因為它不是 Active Record 的物件,所以我們要透過 flash 來建立錯誤訊息。

之前的註冊表單,我們使用了 form_for 方法,並接受一個實例變數 @userform_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="&#x2713;" />
  <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]