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

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

ただいまの
回答率

90.33%

  • Ruby on Rails

    7684questions

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

  • Devise

    262questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 328

seen

score 39

質問を追記します。 下記エラーは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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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

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

    キャンセル

  • 2017/08/14 00:48

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

    キャンセル

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/19 10:34

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

    キャンセル

同じタグがついた質問を見る

  • Ruby on Rails

    7684questions

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

  • Devise

    262questions

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