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

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

ただいまの
回答率

87.58%

link_toでUrlGenerationError

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,138
退会済みユーザー

退会済みユーザー

登録しているユーザーを一覧表示するページを作っています。
以下のようなエラーが発生して困っています。
色々と調べたのですが解決できなかったため見て頂けると嬉しいです。

ActionController::UrlGenerationError in Users#index
Showing /home/ec2-user/environment/bookers-level2.herokuapp/app/views/users/index.html.erb where line #20 raised:

No route matches {:action=>"edit", :controller=>"users"} missing required keys: [:id]
Extracted source (around line #20):
18  </tr>
19  </table>
20  <%= link_to edit_user_path, class: "btn btn-default" do %> ←エラー箇所
21  <i class="fa fa-wrench"></i>
22  <% end %>
23  <p>New book</p>

以下必要そうなコードになります。

users_controller

class UsersController < ApplicationController
  def index
    @user = current_user
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
    @book = Book.new
    @books = @user.books
  end

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

  private

  def user_params
    params.require(:user).permit(:name, :introduction, :profile_image_id)
  end
end


index.html.erb

<%= render 'shared/header' %>

<div class="top">

<div class="container">
  <div class="row">
    <div class="col-lg-3">
    <p>User info</p>
      <%= attachment_image_tag @user, :profile_image_id, :fill, 250, 250, format: 'jpeg', fallback: "no_image.jpg", size:'250x250' %>
        <table class="table">
          <tr>
          <th>name</th>
          <th><%= current_user.name %></th>
         </tr>
         <tr>
          <th>introduction</th>
          <th><%= current_user.introduction %></th>
        </tr>
        </table>
      <%= link_to edit_user_path, class: "btn btn-default" do %>
        <i class="fa fa-wrench"></i>
      <% end %>
      <p>New book</p>
      <%= form_for(@book, url: '/users') do |f| %>
        <p>Title</p>
        <%= f.text_field :title %>
        <p>Opinion</p>
        <%= f.text_area :body %>
        <%= f.submit 'Create Book' %>
      <% end %>
    </div>

    <div class="col-lg-9">
      <p>Books</p>
      <table class="table table-hover">
        <thead>
          <tr>
            <th></th>
            <th>Title</th>
            <th>Opinion</th>
          </tr>
        </thead>
        <tbody>
          <% if @users.present? %>
            <% @users.each do |user| %>
            <tr>
              <td></td>
              <td><%= user.title %></td>
              <td><%= user.opinion %></td>
            </tr>
            <% end %>
          <% end %>
        </tbody>
      </table>
    </div>

  </div>
</div>

</div>

<%= render 'shared/footer' %>

routes.rb

Rails.application.routes.draw do
  devise_for :users

  get root 'top#top'

  get '/home/about', to: 'top#home'

  resources :users

  resources :books


  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

$ rake routes

                  Prefix Verb   URI Pattern                    Controller#Action
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
           user_password PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
                         POST   /users/password(.:format)      devise/passwords#create
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
       user_registration PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
                         POST   /users(.:format)               devise/registrations#create
                    root GET    /                              top#top
              home_about GET    /home/about(.:format)          top#home
                   users GET    /users(.:format)               users#index
                         POST   /users(.:format)               users#create
                new_user GET    /users/new(.:format)           users#new
               edit_user GET    /users/:id/edit(.:format)      users#edit
                    user GET    /users/:id(.:format)           users#show
                         PATCH  /users/:id(.:format)           users#update
                         PUT    /users/:id(.:format)           users#update
                         DELETE /users/:id(.:format)           users#destroy
                   books GET    /books(.:format)               books#index
                         POST   /books(.:format)               books#create
                new_book GET    /books/new(.:format)           books#new
               edit_book GET    /books/:id/edit(.:format)      books#edit
                    book GET    /books/:id(.:format)           books#show
                         PATCH  /books/:id(.:format)           books#update
                         PUT    /books/:id(.:format)           books#update
                         DELETE /books/:id(.:format)           books#destroy
              refile_app        /attachments                   #<Refile::App app_file="/home/ec2-user/.rvm/gems/ruby-2.6.3/bundler/gems/refile-46b4178654e6/lib/refile/app.rb">
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

edit_user_pathが存在しないのだと思います、railsは独自のパス命名規則があるはずなので、ルートを確認してみてはいかがでしょうか

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/17 14:00

    ご回答頂きありがとうございます。
    ルートを見てみましたが、edit_user_pathはあるようでした。
    ルーティングを追加しましたので、ご確認頂けると嬉しいです。

    キャンセル

  • 2019/11/17 15:10

    すみませんエラー見落としていました。
    ユーザーパスはあるようですね。
    原因はエラーメッセージにある通り、ユーザー編集のユーザーを特定するためのユーザーidがlink_toに渡されていないことが原因かと思われます。
    誰を編集するのか、を指定してあげれば動くと思います

    キャンセル

  • 2019/11/17 22:38 編集

    こんばんは。
    link_to edit_user_path(@user)と書き換えてみたところ、エラー文が変化しました。

    ActionController::UrlGenerationError in Books#index
    Showing /home/ec2-user/environment/bookers-level2.herokuapp/app/views/books/index.html.erb where line #20 raised:

    No route matches {:action=>"edit", :controller=>"users", :id=>nil} missing required keys: [:id]

    このようになりました。

    キャンセル

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

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

関連した質問

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