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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

Q&A

解決済

2回答

551閲覧

マイページ構築,サインアップ後の処理でエラー

seen

総合スコア49

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

0グッド

0クリップ

投稿2017/08/09 11:32

編集2017/08/11 00:38

質問を追記します。 下記エラーはm_showのviews内にあるリンク先のidが付いていないために発生していると思うのですが、(現状は_path(@article))
article(プロフィール記事)はサインアップ後に作るためサインアップ時に作られたuser_idに該当する記事はまだない状態です。
現状はログイン後、ログインしたアカウントが持っているuser_idを持った記事を呼び出すべくアプリケーションコントローラーに

def after_sign_in_path_for(resource) m_show_articles_path(user_id: resource.id) end ```とし、呼び出し先のアーティクルコントローラーでは ```ここに言語を入力 def m_show @article = Article.find_by(user_id: params[:user_id]) end ```としてログインはうまくいっています。 それとは別にサインアップではアプリケーションコントローラーに ```ここに言語を入力 def after_sign_up_path_for(resource) new_article_path(@article) end

としてアーティクルコントローラーは

def new @article = Article.new end ```としているのですが、newアクションである登録フォームに行く前に下記のエラーが発生してしまいます。 サインインはログインでもあるのでm_showアクションまで実行されているということなんでしょうか.. イメージ的には サインアップ→フォームにて記事作成→user_idリンク完了 ログイン→user_id記事を表示 なのですが、こういった場合の解決方法はありますか? どなたかご教示していただけますと助かります。 -以下追記前- articlesというプロフィールページをユーザーが登録していくようなサイトを作っています。 新しいユーザーとしてサインアップしたところ以下のようなエラーが出てしまいました。 ActionController::UrlGenerationError in Articles#m_show Showing /vagrant/shinya/app/views/articles/m_show.html.erb where line #2 raised: No route matches {:action=>"edit", :controller=>"articles", :id=>nil} missing required keys: [:id] 現在は通常のCRUDシステムの他にマイページとしてshowを増設してm_showとし、そこで記事の更新や削除をできるようにしています。 articleのカラムにuser_idを付け、サインアップ時に付けられるuser_idと紐付ける形にしたいのですが、 すでにuser_id付きのプロフィール記事をログイン時にマイページ的に表示する作業が完了したところで今度はサインアップでエラーが出てしまったというところです。 エラーのParamus欄にはuser_idが表示されています。 少し前までは記事が作れていたので色々見なおしてみたのですが原因がわかりません。 どなたかご教授いただけないでしょうか。 よろしくおねがいします

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

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

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

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

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

guest

回答2

0

まず今回はサインアップ後のルーティングとサインイン後のルーティングを分ける事が前提でしたが、after_sign_up_のルーティングを設定する方法を調べ抜くことができず、「サインアップ後のルーティングもafter_sign_in_に依存しているようだ」という解釈で進めることにしました。
サインイン後のルーティングは、メンバーページであるm_showに行くように設定しているためサインアップ直後にはマイページは作成していません。
m_showはshowページとほぼ同様のものでフォームから登録する予定の@articleとしているところが複数あります。
メンバーぺージということでサインアップした時点でuser_idを持つ@articleという自分の記事を探しに行きますが無いのでnilとなっています。
そこで今回は

class ApplicationController < ActionController::Base def after_sign_in_path_for(resource) if @article.nil? new_article_path else m_show_articles_path(user_id: resource.id) end

このようにしました。 ご回答いただいた「present?」が大きなヒントになり非常に感謝しています。
レイルスは現在勉強中でプロトタイプのアプリを手探りで作製しているところで、メンバーページに関してこれが正解なのかわかりませんが、今回はこのようにして先に進みたいと思います。 ありがとうございました。

投稿2017/08/14 14:18

seen

総合スコア49

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

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

seen

2017/08/19 01:34

解決したかと思いましたがローカルサーバーのいたずらか、一見上手くいっていましたがこの記述ではサインアップ後もnewアクションに飛んでしまいました。  こちらの質問はご回答くださったchelsy7110さんをベストアンサーにさせていただき、別の質問をたてようと思います。よろしくお願いします。 https://teratail.com/questions/88801
guest

0

ベストアンサー

コードを書く時はバッククォートを3つで囲むか、コード部を選択して書き込み欄の上の </> みたいなボタンを押してコードを見やすくしてください。

エラーの
No route matches {:action=>"edit", :controller=>"articles", :id=>nil} missing required keys: [:id]
ですが、articles#editはidが必要なのに無いからエラーとなっています。
m_show.html.erbでedit_article_path(@article)の様な記述をしているのではないでしょうか。

m_showアクションで@article = Article.find_by(user_id: params[:user_id])としていますので、現状@articleはnilとなっているはずです。
@articleの存在の有無で遷移先を変えるなどの処理が必要だと思います。

例:

ruby

1@article.present? ? edit_article_path(@article) : new_article_path

投稿2017/08/10 09:29

chelsy7110

総合スコア596

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

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

seen

2017/08/11 00:52

ご回答ありがとうございます。 コードの書式を変更しました。 おっしゃる通りm_show.html.erbではedit_article_path(@article)と記述しています。   いただいたご教示を参考に def after_sign_up_path_for(resource) if @article.present? new_article_path(@article) else new_article_path(@article) end end としてみましたが同じエラーが発生しました。
chelsy7110

2017/08/11 10:41

そこではなくて、m_show.html.erbでedit_article_path(@article)の部分を (@article.present? ? edit_article_path(@article) : new_article_path) これに置き換えてみてください
seen

2017/08/13 15:48

(@article.present? ? edit_article_path(@article) : new_article_path) このような書き方があるのですね。 自分では行きつけなかったです。ありがとうございます。 エラーは消えましたが、すべてのnilの@articleを拾ってしまい解決にはいたりませんでしたが、お答えを参考に自己解決いたしました。 後日記載いたします。 present? 関連を調べなおし大変参考になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問