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

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

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

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

1回答

412閲覧

Railsでメール送信画面を表示したい

kkbeams

総合スコア17

Ruby on Rails

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2020/03/02 02:43

前提・実現したいこと

アカウント登録画面でユーザー情報を記入して送信後に,メール送信後に以下のメール送信完了画面を表示させたい.

app/views/account_activations/sent.html.erb

<p> ご入力いただいたメールアドレス(<%= @user.email %>)に、確認用メールを送信しました。 メール本文に記載されているURLを開き、会員登録を完了させてください。 </p>

発生している問題・エラーメッセージ

NoMethodError in AccountActivations#sent undefined method `email' for nil:NilClass

イメージ説明

該当のソースコード

routes.erb

Rails.application.routes.draw do get '/signup', to: 'users#new' root 'static_pages#home' get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' resources :users get '/account_activations/sent', to: 'account_activations#sent' resources :account_activations, only: [:edit] end

app/controllers/account_activations_controller.erb

class AccountActivationsController < ApplicationController def sent @user = User.find_by(id: params[:user_id]) end end

app/controllers/users_controller.erb

class UsersController < ApplicationController def new @user = User.new end def create @user = User.new(user_params) if @user.save @user.send_activation_email redirect_to account_activations_sent_url else render 'new' end end private def user_params params.require(:user).permit(:name, :email, :comment, :password) end end

app/views/users/new.html.erb

<% provide(:title, 'Sign up') %> <h1>登録する</h1> <div class="row"> <div class="col-md-6 col-md-offset-3"> <%= form_for(@user) do |f| %> <%= render 'shared/error_messages' %> <%= f.label :name %> <%= f.text_field :name, class: 'form-control' %> <%= f.label :email %> <%= f.email_field :email, class: 'form-control' %> <%= f.label :password %> <%= f.password_field :password, class: 'form-control' %> <%= f.submit "登録する", class: "btn btn-primary" %> <% end %> </div> </div>

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

get '/account_activations/sent', to: 'account_activations#sent'

だと @user = User.find_by(id: params[:user_id])で必要なparams[:user_id]が取得できません。ゆえに、@userがnilになってしまいます。

例えば

get '/account_activations/:user_id/sent', to: 'account_activations#sent'

のように変更して、user_idをもつpathにしてあげるとうまくいくかと思います。

投稿2020/03/02 04:19

hatsu

総合スコア1809

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

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

kkbeams

2020/03/03 02:19

回答ありがとうございます! ルーティングの部分をアドバイスに従って変更したのですが、controllerの方の「redirect_to ~」の部分はどのように変えればいいでしょうか? 「account_activations_sent_url」に「:user_id」を加えた場合の書き方をご教授いただきたいです。
hatsu

2020/03/03 05:54

redirect_to 〇〇_path(@user) とかになるかと思います。 〇〇の部分は、ターミナルで、rails routes を実行し、メール送信完了画面に該当する(get '/account_activations/sent', to: 'account_activations#sent')のパスを記述します。引数に、UserIDを渡す必要があると思うので、〇〇_path(@user)と@userを渡しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問