🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

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

Q&A

解決済

2回答

412閲覧

【Ruby on Rails】Routing errorについて

yutotech

総合スコア5

Ruby on Rails

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

0グッド

0クリップ

投稿2019/12/24 15:51

編集2019/12/25 16:39

前提・実現したいこと

Ruby on Railsでアクションメーラーを用いて問合せフォームを実装したいと考えています。

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

問い合わせフォームにメールアドレス・問い合わせ内容を入力し送信ボタンをクリックしたところ、
下記画像の通り、Routingエラーとなってしまいました。
解決策をご教示いただきたくお願いいたします。
イメージ説明
Routes.rbで正しくルーティングが記載されているか、該当のコントローラに記載ミスが無いか何度も見直しましたが、
解決策が見出せず質問させていただきました。
不足情報が無いように記載しているつもりではございますが、万が一不足情報ございましたらお手数ですがご教示ください。

Routes.rb

Rails.application.routes.draw do root to: "toppages#index" get "signup", to: "users#new" resources :users, only: [:show, :new, :create] get "login", to: "sessions#new" post "login", to: "sessions#create" delete "logout", to: "sessions#destroy" get "housework_list", to: "houseworks#index" resources :houseworks, only: [:new, :create, :destroy] resources :housework_schedules, only: [:new, :create, :destroy] resources :relationships, only: [:create, :update, :destroy] resources :contacts, only: [:new, :create] end

views/toppages/index.html.erb

問合せフォームのソースコードはこちらに"contacts/contact/form"としてrenderしています。

<div class="container"> <div class="row"> <div class="col-sm-6 offset-3 mb-5"> <h1 class="text-center pb-5">お問い合わせ</h1> <%= render "contacts/contact_form", contact: @contact %> </div> </div> </div>

views/contacts/_contact_form.html.erb

問合せフォームのソースコードになります。

<%= form_with(model: contact, local: true) do |f| %> <div class="form-group"> <%= f.label :email, '返信先メールアドレス' %> <%= f.text_field :email, class: 'form-control' %> </div> <div class="form-group"> <%= f.label :message, 'お問い合わせ内容' %> <%= f.text_area :message, size: '10x10', class: 'form-control' %> </div> <%= f.submit '送信', class: "btn btn-primary btn-block" %> <% end %>

###toppages_controller
toppageのindex.html.erbにrenderしているため、toppages#indexに@contactとして定義しています。

class ToppagesController < ApplicationController def index if logged_in? 省略 else @contact = Contact.new end end end

###app/mailers/application_mailer.rb

こちらはデフォルトのままで変更していません。

class ApplicationMailer < ActionMailer::Base default from: 'from@example.com' layout 'mailer' end

###app/mailers/contact_mailer.rb
herokuでheroku config:set ENV_MAIL(環境変数)=値は実行済みです。

class ContactMailer < ApplicationMailer def contact_mail(contact) @contact = contact mail to: ENV_MAIL["MAIL"], subject: "お問い合わせがありました" end end

###views/contact_mailer/contact_mail.html.erb

<h3>お問い合わせ内容</h3> ============================================================ <p>email: <%= @contact.email %></p> <p>content: <%= @contact.message %></p> ============================================================

###contacts_controller

class ContactsController < ApplicationController def create @contact = Contact.new(contact_params) if @contact.save ContactMailer.contact_mail(@contact).deliver flash[:success] = "お問い合わせを受け付けました" redirect_to root_path else render :new end end private def contact_params params.require(:contact).permit(:email, :message) end end

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

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

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

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

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

guest

回答2

0

ベストアンサー

<%= form_with(model: contact, local: true) do |f| %>

<%= form_with(model: @contact, local: true) do |f| %>
にしてみてください

投稿2019/12/24 20:59

winterboum

総合スコア23567

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

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

yutotech

2019/12/25 03:23

ご回答ありがとうございます。 アドバイス頂きました内容に修正し、送信ボタンを押したところ、変わらずRoutingエラーとなってしまいます...
winterboum

2019/12/25 08:01 編集

エラーの内容は同じですか? それと、問い合わせフォームを呼び出すcontroller、actionはどれでしょう
yutotech

2019/12/25 08:32 編集

はい、エラー内容に変化はありませんでした。 問い合わせフォーム自体は `views/toppages/index.html.erb` 内にてrenderしているため、toppages controllerの indexアクション内に `@contact = Contact.new` として定義しております。
winterboum

2019/12/25 09:37

1) routes.rbは抜粋でなく、全部載せてください。 2) <%= form_with(model: contact, local: true)  がどういうhtmlになっているか見せてください
yutotech

2019/12/25 16:36

1) routes.rbの詳細とファイルパスを上記に追記させていただきました。 2) 上記の `views/contacts/_contact_form.html.erb` が <%= form_with(model: contact, local: true)のhtmlになります。 パーシャルで作成しております。 それを上記のviews/toppages/index.html.erbにrenderしております。
winterboum

2019/12/25 20:36

2)そこは理解しています。確認したいのはその結果どういうhtmlになってブラウザに送られているか、です。 <%= form_with(model: contact, local: true) からは <form action="/contacts" method="post" が期待されますが、 <form action="/" method="post" な動きになっているので、その確認です。 action="/contacts" なのに "/" に届くのか、action="/" になってしまっているのか
winterboum

2019/12/25 20:45

ああ、、、、、 「、ログイン前にしか問い合わせページは表示させていないので」とありますが toppages/index.html にも _contact_form.html にも 「ログインしていたらformは表示しない」仕掛けが無いようにみえます。 ログインしていない状態でアクセスしているつもりが、クッキーか何かの影響で、「ログイン済」と判断されている可能性はないですか? 3) <%= form_with(model: contact, local: true) を  <%= form_with(model: Cntact.new , local: true) にするとどうなります?
yutotech

2019/12/26 07:10

2) 初学者の為、理解不足で大変申し訳ありませんが、「どういうhtmlになってブラウザに送られているか」に関してはどのように確認しお伝えすればよろしいでしょうか? 「toppages/index.html にも _contact_form.html にも 「ログインしていたらformは表示しない」仕掛けが無い」に関しましては、toppages/index.htmlにていくつも条件分岐しており ソースコードがかなり長くなってしまいそうでしたので、必要と思われる箇所のみ記載させていただきました次第です。 ログイン前のトップページに問い合わせフォームは表示されるようにしており、ログイン後は別ページに遷移します。 また、ログアウト後はログイン前のトップページと同様に問い合わせフォームが表示されるようにしています。 3) <%= form_with(model: Cntact.new , local: true) にしたところ、   「uninitialized constant ContactMailer::ENV_MAIL」という別のエラーになりました。(これはこれでまた原因を調べないとですね。。。) こうなった=元の<%= form_with(model: contact , local: true)に問題ありということですね。
winterboum

2019/12/26 07:54

ごめん Cntact.new  typoだ Contact.new ブラウザによって操作異なるかも、ですが、 マウス右クリックすると「ページのソースを表示」とかないですか?
yutotech

2019/12/26 09:21 編集

お問い合わせフォームに関して「ページのソースを表示」にて表示されたソースコードを以下に記載致しましたので 恐れ入りますが、ご確認くださいますようお願いいたします。 <div class="container"> <div class="row"> <div class="col-sm-6 offset-3 mb-5"> <h1 class="text-center pb-5">お問い合わせ</h1> <form action="/contacts" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="OsWYVSg5v10Ug8Vu20paobtBQ8W4XsdHSeWmmmW3VZSZfm7etXlNYuqkaxREnAZqvpe+S//G6DEhCybXrQzaSQ==" /> <div class="form-group"> <label for="contact_email">返信先メールアドレス</label> <input class="form-control" type="text" name="contact[email]" id="contact_email" /> </div> <div class="form-group"> <label for="contact_message">お問い合わせ内容</label> <textarea class="form-control" name="contact[message]" id="contact_message" cols="10" rows="10"> </textarea> </div> <input type="submit" name="commit" value="送信" class="btn btn-primary btn-block" data-disable-with="送信" /> </form> </div> </div> </div>
winterboum

2019/12/26 09:12

このblol:null/ なにがしってなんでしょう?
winterboum

2019/12/26 09:14

全体はいらないので、<form ...>の行だけでよいので、コピペ出来ませんか
yutotech

2019/12/26 09:23

すみません、画像ではなく、ソースコードに変更致しました。 お手数お掛けし申し訳ございません。
winterboum

2019/12/26 09:40

どこにあります?
yutotech

2019/12/26 09:52

上記18:05にコメントさせていただきましたソースコードの以下部分になります。 <div class="container"> <div class="row"> <div class="col-sm-6 offset-3 mb-5"> <h1 class="text-center pb-5">お問い合わせ</h1> <form action="/contacts" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="OsWYVSg5v10Ug8Vu20paobtBQ8W4XsdHSeWmmmW3VZSZfm7etXlNYuqkaxREnAZqvpe+S//G6DEhCybXrQzaSQ==" />
winterboum

2019/12/26 10:02

<form action="/contacts"  になっていますね。 なのに エラーは No route matches "/" はて、、、 このhtmlが取れた時も 同じエラーですか?
yutotech

2019/12/26 16:11

すみません... Contact.newで試した時の状態で貼り付けてしまいました。 正しくは以下となります。 <div class="container"> <div class="row"> <div class="col-sm-6 offset-3 mb-5"> <h1 class="text-center pb-5">お問い合わせ</h1> <form action="/" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="yY53FmKaoLZ0Fx1Im7Hij1KmbcOQOOzoLrl4H11muk/wJQhywz9xFaFVau7qMrldU+3iDvQPrNRy9NINywyqqw==" /> <div class="form-group"> <label for="email">返信先メールアドレス</label> <input class="form-control" type="text" name="email" id="email" /> </div> <div class="form-group"> <label for="message">お問い合わせ内容</label> <textarea class="form-control" name="message" id="message" cols="10" rows="10"> </textarea> </div> <input type="submit" name="commit" value="送信" class="btn btn-primary btn-block" data-disable-with="送信" /> </form> </div> </div> </div>
winterboum

2019/12/27 03:38

こちらは "/"なのであのエラーはわかります。 Contact.newで試した時は何が駄目だったのですか?
yutotech

2019/12/27 08:07

Contact.newで試したときは「uninitialized constant ContactMailer::ENV_MAIL」という別のエラーが出ておりました。 「ContactMailerのENV_MAILが定義されていない」という意味かと思いますが、そこの原因はまだ精査できていない状況です。
winterboum

2019/12/27 08:12

そこのエラーをいただけますか。どのfi;eのどこで起きたか
winterboum

2019/12/27 11:52

これは単にていぎすれば良いだけですね。
yutotech

2019/12/27 13:04

Herokuでデプロイしたい為、 $ heroku config:set ENV_MAIL=メールアドレス としてみましたが、同じエラーが出ますね。ふむ... Qiitaなどでも色々調べたものの、解消方法わからずですorz
winterboum

2019/12/27 13:18

class ContactMailer に ENV_MAIL["MAIL"]=... とすればよいのでは?
yutotech

2019/12/27 13:30

ENV_MAIL["MAIL"]=メールアドレスとしてもエラー内容変わらずです...
winterboum

2019/12/27 14:10

え?その行でエラー出ませんでしたか? ENV_MAIL = {"MAIL" =>メールアドレス} とすべきでした それでも出るようでしたら、class ContactMailer の最新codeを
yutotech

2019/12/28 13:49 編集

現在Contact Mailerは以下のようなコードにしており、この状態でエラーが出ております。 ご確認よろしくお願い致します。 class ContactMailer < ApplicationMailer def contact_mail(contact) @contact = contact ENV_MAIL = {"MAIL" => メールアドレス} mail to: ENV_MAIL["MAIL"], subject: "お問い合わせがありました" end end
winterboum

2019/12/28 21:43

ENV_MAIL = {"MAIL" => メールアドレス}はclass定数かgrobal定数にしたいので、defの外に出してください。 にしても mail to: ENV_MAIL["MAIL"], subject: "お問い合わせがありました" でuninitialized constant ContactMailer::ENV_MAIL」 ですか? 場所がちがうのでは? エラーがでて、それで原因がつかめない時は、それが理解できる人に見せなければ原因はわかりません。エラーメッセージはちゃんと示してください
yutotech

2020/01/01 14:19 編集

def contact_mail(contact)の中にENV_MAIL = {"MAIL" => メールアドレス}を記述していた際のエラーは メソッドの中に定義していたことによる「dynamic constant assignment」というエラーでした。 混乱させてしまい、申し訳ございませんでした。 ご指摘いただきました通り、 class ContactMailer < ApplicationMailer ENV_MAIL = {"MAIL" => "自分のメールアドレス"} def contact_mail(contact) @contact = contact mail to: ENV_MAIL["MAIL"], subject: "お問い合わせがありました" end end に変更したところ、エラーは解消されました。 ありがとうございました。 Herokuにデプロイする際は環境変数が見えてしまうと問題である為、heroku上で環境変数を設定しつつ、 SendGridというHerokuのアドオンツールがあるようなので、そちらでメール送信の設定を別途進めたいと思います。 不慣れな点が多く、ご面倒おかけいたしましたが、ご丁寧に教えていただき誠にありがとうございました。
winterboum

2019/12/29 08:10

ですと、ENV["MAIL"] ですね、参照は 。 うまく行ってよかったです
guest

0

ログイン済ユーザーでアクセスしているため、@contact がnilになっているということはないでしょうか?

ruby

1if logged_in? 2 #省略 # <= こっちの分岐に入っている 3 @contact = Contact.new # <= こうするとうまくいかないでしょうか? 4else 5 @contact = Contact.new 6end

投稿2019/12/25 05:51

ducci

総合スコア191

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

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

yutotech

2019/12/25 08:04

ご回答ありがとうございます。 その可能性もあるかと思いましたが、ログイン前にしか問い合わせページは表示させていないので、ログイン後のエラーは起きませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問