search
LoginSignup
0

posted at

rails5 progate 整理メモ

ログイン失敗時のメッセージを表示させる

送信されたパラメータにあうユーザーがない場合にメッセージを表示させる。
その時にお題のメッセージを表示させる

どうやってエラーメッセージを表示させるのか忘れた。

ちょっと答えを見た。

users_controller.rb
def login
    .
    .
    .
    else 
      @error_messeage = "メールアドレスまたはパスワードが間違っています"
      render("login")
    end
  end

loginページに行く前にインスタンス変数に代入しておく。そうすることで中身を入れることができる。

<% if @error_messeage %>

@error_messeageに中身があれば表示されるようにする。

login.html
        <% if @error_messeage%>
          <div class="form-error">
            <!-- 以下の<%= %>を用いてエラーメッセージを表示してください -->
            <%= @error_messeage %>
          </div>
        <% end %>

これで表示された。

ログインに失敗した場合にフォームに初期値が入るようにしましょう。

送信されたパラメータが保存されるようにする
ログインした時にどういうことをやっていたかを振り返る。

users_controller.rb
def login
    @user = User.find_by(
      email: params[:email],
      password: params[:password])
    if @user
      session[:user_id] = @user.id
      flash[:notice] = "ログインしました"
      redirect_to("/posts/index")
    else
      @email = params[:email]
      @password = params[:email]
      @error_messeage = "メールアドレスまたはパスワードが間違っています"
      render("login")
    end
  end

多分else以下にしたのはその時だけ実行させるため、余計なことをさせないためだと思う。
インスタンス変数に送信されたパラメータを代入させる

@email = params[:email]

どうやって文字列を表示させるか

<input ... value= <%= "@email" %>>

これを使う。

ログインに失敗した場合に、メールアドレスが初期値としてフォームに表示されていません

この原因はよくわからなかった。
思い当たるところとしては

routes.rb
  get "login" => "users#login"
  post "login" => "users#login"

ビューのアクションとログインさせるアクションを合わせていたからだと思っている。

routes.rb
  get "login" => "users#login_form"
  post "login" => "users#login"

他にあると思うが今は思いつかない。
あの時焦らずに調べながら直していければよかった。

ユーザー登録時にログイン状態にしよう

user_controller.rb
  def create
    @user = User.new(
      name: params[:name],
      email: params[:email],
      password: params[:password],
      image_name: "default_user.jpg"
      )
    if @user.save
      session[:user_id] = @user.id
      flash[:notice] = "ユーザー登録が完了しました"
      redirect_to("/users/#{@user.id}")
    else
      @password = params[:password]
      render("users/new")
    end
  end

新規登録ページ

new.html
.
.
.
        <%= form_tag("/users/create") do %>
          <p>ユーザー名</p>
          <input name="name" value="<%= @user.name %>">
          <p>メールアドレス</p>
          <input name="email" value="<%= @user.email %>">
          <p>パスワード</p>
          <input type="password" name="password" value="<%= @user.password %>">
          <input type="submit" value="新規登録">
        <% end %>
.
.
.

答えでは

user_controller.rb
@password = params[:password]

を書かずに

new.html
<input type="password" name="password" value="<%= @user.password %>">

@userのパスワード属性を呼んでた。
そのほうが1行書かずに済むからだろう。
それを真似した。

まだまだrailsの旅は続く!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0