ログイン失敗時のメッセージを表示させる
送信されたパラメータにあうユーザーがない場合にメッセージを表示させる。
その時にお題のメッセージを表示させる
どうやってエラーメッセージを表示させるのか忘れた。
ちょっと答えを見た。
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の旅は続く!