km1994
@km1994 (慶太朗 丸山)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ActionController::UrlGenerationError in Cans#index解決方法

解決したいこと

ruby on railsで簡単な投稿アプリを作っています。
トップページにあるユーザー名をクリックするとマイページに遷移するところで詰まっています。
解決方法を教えてください。

発生している問題・エラー

ActionController::UrlGenerationError in Cans#index
app/views/cans/index.html.erb where line #4 raised:

No route matches {:action=>"show", :can_id=>#<User id: 2, nickname: "kei", email: "test@com", created_at: "2021-04-05 10:32:06", updated_at: "2021-04-05 10:32:06">, :controller=>"users"}, missing required keys: [:id]
Extracted source (around line #4)

  <div class="greeting">
    ユーザー名:
    <%= link_to "#{current_user.nickname}", can_user_path(current_user), class: :greeting_link %>さん
  </div>
<% end %>

該当するソースコード config/routes.rb

Rails.application.routes.draw do
  devise_for :users
  root to: 'cans#index'
  resources :cans do
    resources :comments, only: :create
    resources :users, only: :show
  end
end

該当するソースコード controllers/users_controller.rb

class UsersController < ApplicationController
  def show
    user = User.find(params[:id])
    @nickname = user.nickname
    @cans = user.cans
  end
end

該当するソースコード cans/index.html.erb

<% if user_signed_in? %>
  <div class="greeting">
    ユーザー名:
    <%= link_to "#{current_user.nickname}", can_user_path(current_user), class: :greeting_link %>さん
  </div>
<% end %>

<div class="main-top">
  <% @cans.each do |can| %>
    <div class="can">
      <%= link_to image_tag(can.image, class: :can_img), can_path(can.id) if can.image.attached? %>
      <div class="can_name">
          <%= can.user.nickname %>さん
          <div class="can_active">
            -<%= can.active.name %>-
          </div>
     </div>
  <% end %>
</div>

該当するソースコード users/show.html.erb

<div class="main-top">
<p><%= @nickname %>さんの投稿一覧</p>
  <% @cans.each do |can| %>
    <div class="can">
      <%= link_to image_tag(can.image, class: :can_img), if can.image.attached? %>
      <div class="can_name">
          <%= can.user.nickname %>さん
          <div class="can_active">
            -<%= can.active.name %>-
          </div>
     </div>
  <% end %>
</div>

自分で試したこと

rails routesを確認し
can_user_path(current_user)指定
あまり理解できていない部分もありますがご教授お願いします。

1

1Answer

エラーメッセージを見ると

ActionController::UrlGenerationError in Cans#index
app/views/cans/index.html.erb where line #4 raised:

Cans#index で URLを生成するときにエラーが起きている、と言っています。

発生個所は app/views/cans/index.html.erb の 4 行目ですね。

<%= link_to "#{current_user.nickname}", can_user_path(current_user), class: :greeting_link %>さん

URLが作れないと言っているので、問題は can_user_path ヘルパーだと思います。

rails routes の結果を確認してもらっても、おそらく Prefixcan_user というものはないはずです。

UsersController の show を呼びたいのだと思いますが、その場合には user_path ヘルパーを使うのだと思います。

1Like

Comments

  1. @km1994

    Questioner

    Rails.application.routes.draw do
    devise_for :users
    root to: 'cans#index'
    resources :cans do
    resources :comments, only: :create
    end
      resources :users, only: :show     ←ここを移動した
    end

    そもそもルーティングの位置が違っていたのでcan_user_pathというヘルパーになっていた。
    ルーティングの配置を変え、rails routes の結果を確認したところuser_path ヘルパーで間違いありませんでした。
    追加でcontrollers/users_controller.rbのuser.nickname、user.cansに@を追加したところ正常に動作確認が取れました。
    とても助かりました。ありがとうございました。

Your answer might help someone💌