質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

2回答

1570閲覧

form_forについて、エラーを解決したい。

yume0409

総合スコア45

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/02/14 09:02

form_forについてです。

#解決したい内容
最終的にやりたい内容はログイン機能でメールアドレスかパスワードが間違っていたらエラーメッセージを出すようにしたいです。
ログインはdeviseを使用しました。
今はエラーメッセージより正常にログインのビューを表示させたいです。
コントローラーをカスタマイズすることは出来ました。

sessions/new.html.haml

.new %h4 ログイン = form_for(@user) do |f| - if @error_message .error = @error_message .field = f.label :email %br/ = f.email_field :email, autofocus: true, autocomplete: "email", class: "text" .field = f.label :password %br/ = f.password_field :password, autocomplete: "current-password", class: "text" - if devise_mapping.rememberable? .field = f.check_box :remember_me = f.label :remember_me

sessions.controller.rb

def new @user = User.find_by(email: params[:email], password: params[:password]) if @user redirect_to :root else @error_message = "エラー" @email = params[:email] @password = params[:password] render "devise/sessions/new" end end

コントローラーの2行目をfind_byにすると下記のエラーメッセージが出ます。
エラー個所はビューの3行目のform_forなのでその引数に当たる、@userがおかしいんだと思います。

ArgumentError in Users::Sessions#new First argument in form cannot contain nil or be empty

なのでコントローラーの2行目をnewに変えてみました。

def new @user = User.new if @user redirect_to :root else @error_message = "エラー" @email = params[:email] @password = params[:password] render "devise/sessions/new" end end

そしたらエラーはなくなるのですが、恐らく、コントローラーの4行目が動いてると思いますが、ルートにリダイレクトされます。
ログイン押しても瞬時にルートに遷移されます。
これをredirect_to "/users/sign_in"に変更すると

このページは動作していません localhost でリダイレクトが繰り返し行われました。

となります。
これにずっと悩んでいるのでご教授いただけると幸いです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

form_forの第一引数にnilを渡すことはできません。

rb

1@user = User.find_by(email: params[:email], password: params[:password])

の結果がnilになっている場合、@user = User.newを実行するようなコードを追加してみましょう。

投稿2020/02/15 10:19

Mugheart

総合スコア2340

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

yume0409さんの見立てがあっていると思うので、それを前提に回答します。

ログイン処理は概ね以下の流れになると思います。
0. newアクションで@userインスタンスをセット
0. sessions/new.html.hamlでフォームを表示
0. ユーザー名とパスワードを入力してフォームを送信
0. createアクションにリクエストを送信
0. ログイン処理をして、エラーならエラーメッセージを返す
0. ログインが成功した場合はログイン後のページ、エラーの場合はsessions/new.html.hamlでエラーメッセージを表示

今のコードですと、newアクションでインスタンス変数のセットとログイン処理を一緒に実装しているので、うまく行っていないように見えます。

インスタンス変数の設定とログイン処理をわけて実装するとRailsらしい書き方になるので、SessionsControllerは以下のようにするといいと思います。
(コードは既存のコードを再利用したので、適宜修正する必要があるかもしれません。)

rb

1# SessionsController 2 3def new 4 @user = User.new 5end 6 7def create 8 @user = User.find_by(email: params[:email], password: params[:password]) 9 10 if @user 11 redirect_to :root 12 else 13 @error_message = "エラー" 14 @email = params[:email] 15 @password = params[:password] 16 17 render "devise/sessions/new" 18 end 19end

投稿2020/02/14 10:48

shgtkshruch

総合スコア665

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yume0409

2020/02/15 06:22

ありがとうございます。 エラーメッセージが出せるようになりましたが、メールアドレスとパスワードが合っている場合もエラーメッセージが出ます。 loginボタンを押してチャットメインへ遷移されない状態になっています。 コントローラーのcreateにif文がありますが、何か記述のミスはありますでしょうか・・・?
shgtkshruch

2020/02/15 07:36 編集

回答にも書きましたが、createアクションのコードはyume0409さんのコードを利用したものなので、ご自身の設定に応じて修正する必要があると思います。 エラーメッセージが表示されるということはログイン処理ができていないので、ログイン判定を修正してみてください。 form_forのエラーは解決できたと思うので、一旦この回答は解決済みにして、別の質問をたてたほうが課題を混同しないのでいいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問