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

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

ただいまの
回答率

88.82%

Couldn't find User with 'id'= を解決したい

受付中

回答 1

投稿

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

YuichiKanno

score 5

「状況」
現在、deviseを導入したツイッターアプリを作成中であり
ユーザーのプロフィール周りを実装中です。

ユーザーの情報編集のために routes、controller、viewを作成しましたが、
ページに遷移する際にタイトルのエラーが発生しました。

イメージ説明

他のページも参照しましたが、なぜidが見つからないのかが分かりません。
原因及び解決方法を知りたいです。

なお、リンクはユーザー個別ページから飛ぶように設定しています。
以下、該当のソースコードを載せます。

routes.rb

Rails.application.routes.draw do

  root 'static_pages#home'
  get 'static_pages/home'
  devise_for :users, controllers: {
        registrations: 'users/registrations',
        sessions: 'users/sessions'
  }
  devise_scope :user do
    # get "users/:id", :to => "users/registrations#detail"
    get "signup", :to => "users/registrations#new"
    post "signup", :to => "users/registrations#create"
    get "users/[:id]/edit", :to => "users/registrations#edit"
    patch "users", :to => "users/registrations#update"
    get "login", :to => "users/sessions#new"
    post "login", :to => "users/sessions#create"
    delete "logout", :to => "users/sessions#destroy"
  end
  resources :users, only: [:index, :show]
end

app/controllers/users/registrations_controller.rb 

# frozen_string_literal: true

class Users::RegistrationsController < Devise::RegistrationsController
  # before_action :configure_sign_up_params, only: [:create]
  # before_action :configure_account_update_params, only: [:update]

  # GET /resource/sign_up
  def new
    @user = User.new 
  end

  # POST /resource
  def create
    @user = User.new(user_params)
    if @user.save
      log_in @user
      flash[:success] = "Welcome to the Instagram!"
      redirect_to current_user
    else
      render 'new'
    end
  end

  # GET /resource/edit
   def edit
     @user = User.find(params[:id])
   end

  # PUT /resource
  def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      # 更新に成功した場合を扱う。
    else
      render 'edit'
    end
  end

  # DELETE /resource
  # def destroy
  #   super
  # end

  # GET /resource/cancel
  # Forces the session data which is usually expired after sign
  # in to be expired now. This is useful if the user wants to
  # cancel oauth signing in/up in the middle of the process,
  # removing all OAuth session data.
  # def cancel
  #   super
  # end

  # protected

  # If you have extra params to permit, append them to the sanitizer.
  # def configure_sign_up_params
  #   devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
  # end

  # If you have extra params to permit, append them to the sanitizer.
  # def configure_account_update_params
  #   devise_parameter_sanitizer.permit(:account_update, keys: [:attribute])
  # end

  # The path used after sign up.
  # def after_sign_up_path_for(resource)
  #   super(resource)
  # end

  # The path used after sign up for inactive accounts.
  # def after_inactive_sign_up_path_for(resource)
  #   super(resource)
  # end


    def user_params
      params.require(:user).permit(:name, :user_name, :email, :password,
                                   :password_confirmation)
    end
end


app/views/users/shoe.html.erb

<% provide(:title, @user.name) %>
<div class="row">
  <aside class="col-md-4">
    <section class="user_info">
      <h1><%= @user.user_name %></h1>
      <h2><%= @user.name %></h2>
      <p>自己紹介 : <%= @user.profile %></p>
      <%= link_to "プロフィール編集", edit_user_registration_path(current_user) %>
    </section>
  </aside>
</div>

app/views/users/registrations/edit.html.erb 

<h2>プロフィール編集 <%= resource_name.to_s.humanize %></h2>


<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
      <%= render "devise/shared/error_messages", resource: resource %>

        <%= f.label :名前 %>
        <%= f.text_field :name, class: 'form-control' %>

        <%= f.label :ユーザーネーム %>
        <%= f.text_field :user_name, class: 'form-control' %>

        <%= f.label :Webサイト %>
        <%= f.text_field :web, class: 'form-control' %>

        <%= f.label :自己紹介 %>
        <%= f.text_field :profile, class: 'form-control' %>


        <%= f.label :メールアドレス %><br />
        <%= f.email_field :email, autofocus: true, autocomplete: "email" %>

        <%= f.label :電話番号 %>
        <%= f.text_field :phonenumber, class: 'form-control' %>


      <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
        <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
      <% end %>


        <%= f.label :パスワード %> <i>(leave blank if you don't want to change it)</i><br />
        <%= f.password_field :password, autocomplete: "new-password" %>
        <% if @minimum_password_length %>
          <br />
          <em><%= @minimum_password_length %> characters minimum</em>
        <% end %>



        <%= f.label :password_confirmation %><br />
        <%= f.password_field :password_confirmation, autocomplete: "new-password" %>



        <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
        <%= f.password_field :current_password, autocomplete: "current-password" %>

      <div class="actions">
        <%= f.submit "更新する" %>
      </div>
    <% end %>
  </div>
</div>

<h3>Cancel my account</h3>

<p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %></p>

<%= link_to "Back", :back %>

お願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

エラー画面の最後を見ると下の方に Paramaters None とあります。
それを呼び出しているのが show の
<%= link_to "プロフィール編集", edit_user_registration_path(current_user) %>
だとおもいます。
この文でparamsがわたらないとすると current_user がnilになっているのではないかと思われます。
current_userを定義してある所を確認してみて下さい

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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