質問を追記します。 下記エラーは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が表示されています。 少し前までは記事が作れていたので色々見なおしてみたのですが原因がわかりません。 どなたかご教授いただけないでしょうか。 よろしくおねがいします
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
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の存在の有無で遷移先を変えるなどの処理が必要だと思います。
例:
@article.present? ? edit_article_path(@article) : new_article_path
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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?」が大きなヒントになり非常に感謝しています。
レイルスは現在勉強中でプロトタイプのアプリを手探りで作製しているところで、メンバーページに関してこれが正解なのかわかりませんが、今回はこのようにして先に進みたいと思います。 ありがとうございました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/08/11 09: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
としてみましたが同じエラーが発生しました。
2017/08/11 19:41
(@article.present? ? edit_article_path(@article) : new_article_path)
これに置き換えてみてください
2017/08/14 00:48
このような書き方があるのですね。 自分では行きつけなかったです。ありがとうございます。
エラーは消えましたが、すべてのnilの@articleを拾ってしまい解決にはいたりませんでしたが、お答えを参考に自己解決いたしました。 後日記載いたします。 present? 関連を調べなおし大変参考になりました。ありがとうございました。