kahoxx121u
@kahoxx121u (kaho)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

NameError in Prototypes#show

Q&A

Closed

解決したいこと

NameError in Prototypes#show のエラーを解消したい

初心者なので基本的なことをお聞きしていると思います。
お手数ですがよろしくお願いいたします。
Ruby on Railsで画像投稿Webアプリをつくっています。
画像の一覧ページは作成できたのですが、その画像をクリックすると詳細ページに移行するページを作成していて、上記のようなエラーが発生いたしました。解決方法を教えて下さい。
(最初は詳細画面のページは問題なく、コメント欄にコメントが投稿されないエラーを解決していたら、いつの間にか詳細ページすら見れなくなってしまっていました。)

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

NameError in Prototypes#show
ActionView::Template::Error (undefined local variable or method `prototype' for #<#<Class:0x00007faffdf95fb0>:0x00007faffe0b4b08>
Did you mean?  prototype_url):
    14:       <% end %>
    15:       <%# // プロトタイプの投稿者とログインしているユーザーが同じであれば上記を表示する %>
    16:       <div class="prototype__image">
    17:         <%= image_tag(prototype.image, class: :card__img) %>
    18:       </div>
    19:       <div class="prototype__body">
    20:         <div class="prototype__detail">
  
app/views/prototypes/show.html.erb:17

### show.html.erb
```ruby
<main class="main">
  <div class="inner">
    <div class="prototype__wrapper">
      <p class="prototype__hedding">
        <%= @prototype %>
      </p>
      <%= link_to "by#{current_user.name}", root_path, class: :prototype__user %>
      <%# プロトタイプの投稿者とログインしているユーザーが同じであれば以下を表示する %>
      <% if user_signed_in? && current_user.id == @prototype %>
        <div class="prototype__manage">
          <%= link_to "編集する", edit_prototype_path(@prototype.id), method: :get, class: :prototype__btn %>
          <%= link_to "削除する", prototype_path(@prototype.id), method: :delete, class: :prototype__btn %>
        </div>
      <% end %>
      <%# // プロトタイプの投稿者とログインしているユーザーが同じであれば上記を表示する %>
      <div class="prototype__image">
        <%= image_tag(prototype.image, class: :card__img) %>
      </div>
      <div class="prototype__body">
        <div class="prototype__detail">
          <p class="detail__title">キャッチコピー</p>
          <p class="detail__message">
            <%= @prototype.catch_copy %>
          </p>
        </div>
        <div class="prototype__detail">
          <p class="detail__title">コンセプト</p>
          <p class="detail__message">
            <%= @prototype.concept %>
          </p>
        </div>
      </div>
      <div class="prototype__comments">
        <%# ログインしているユーザーには以下のコメント投稿フォームを表示する %>
        <% if user_signed_in? %>
          <%= form_with model: [@prototype, Comment.new], local: true do |f|%>
            <div class="field">
               <%= f.label :comment, "コメント" %><br />
               <%= f.text_field :comment_content, id:"comment_content" %>
            </div>
            <div class="actions">
              <%= f.submit "送信する", class: :form__btn  %>
            </div>
          <% end %>
        <% end %>
        <%# // ログインしているユーザーには上記を表示する %>
        <ul class="comments_lists">
          <%# 投稿に紐づくコメントを一覧する処理を記述する %>
            <li class="comments_list">
              <%= " コメントのテキスト "%>
              <%= link_to @comment.user.name, root_path, class: :comment_user %>
            </li>
          <%# // 投稿に紐づくコメントを一覧する処理を記述する %>
        </ul>
      </div>
    </div>
  </div>
</main>

prototypes_controller.rb

class PrototypesController < ApplicationController
  def index
    @prototypes = Prototype.all
  end

  def new
    @prototype = Prototype.new
  end

  def create
    @prototype = Prototype.new(prototype_params)
    
    if @prototype.save
    redirect_to root_path
    
    else
      render :new
    end 
  end

    def show
     @prototype = Prototype.find(params[:id])
     @comment = Comment.new
     @comments = Comment.find_by(id:params[:id], prototype_id: params[:prototype_id])
    end

  def edit
    @prototype =Prototype.find(params[:id])
  end

  def update
    @prototype = Prototype.new
    @prototype =Prototype.find(params[:id])
    
    if @prototype.update(prototype_params)
    redirect_to root_path

    else
      render :edit
    end
  end

  def destroy
    @prototype =Prototype.find(params[:id])
    @prototype.destroy
    redirect_to root_path
  end

  def show
    @comment = Comment.new
  end

  private
  def prototype_params
    params.require(:prototype).permit(:title, :catch_copy, :concept, :image ).merge(user_id: current_user.id)
  end
end

users_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(params.require(:user).permit(:email, :password, :user_name, :email, :profile, :occupation, :position))
    @user.save
    redirect_to users_path
  end

  def show
    @prototype = Prototype.all
  end

  def edit
  end

  def update
    if current_user.update(user_params)
      redirect_to root_path
    else
      render :edit
    end
  end
end

comments_controller.rb

class CommentsController < ApplicationController
  def create
    @comment = Comment.new
    Comment.create(comment_params)
    redirect_to "/prototypes/#{comment.prototype.id}"
    end
  end

  def show
  @comment = Comment.new
      @comments = @prototype.comments.includes(:user)
  end

  private
  def create_params
    params.require(:comment).permit(:content, :prototype, :user).merge(user_id: current_user.id, prototype_id, params[:prototype_id])
  end
end

application_controller.rb

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :profile, :occupation, :position])
  end
end

prototype.rb

class Prototype < ApplicationRecord
  validates :title, presence: true
  validates :catch_copy, presence: true
  validates :concept, presence: true
  validates :image, presence: true
  belongs_to :user
  has_one_attached :image
  has_many :comments
end

comment.rb

class Comment < ApplicationRecord
  #validates :content, presence: true
  #validates :prototype, presence: true
  #validates :user, presence: true
  belongs_to :user
  belongs_to :prototype
end

routes.rb

Rails.application.routes.draw do
  devise_for :users
  root to: "prototypes#index"
  resources :users
  resources :prototypes do
    resources :commments, onle: :create
  end
end
0

2Answer

Comments

  1. @kahoxx121u

    Questioner

    ありがとうございます。@をつけても以下のようなエラーが出ます。
    (コントローラーでは、@prototype で定義してるので必要ですね。ありがとうございます。)

    undefined method `image' for nil:NilClass
    <%# // プロトタイプの投稿者とログインしているユーザーが同じであれば上記を表示する %>
    <div class="prototype__image">
    <%= image_tag(@prototype.image, class: :card__img) %>
    </div>
    <div class="prototype__body">
    <div class="prototype__detail">
  2. 該当idのデータは存在しますか?
  3. @kahoxx121u

    Questioner

    sequelを確認しても、idには全てデータが入っています。
  4. @prototype = Prototype.find(params[:id])

    このあたりでプリントデバッグしてみてはいかがでしょう

    puts @prototype
    puts params[:id]

  5. @kahoxx121u

    Questioner

    ご返信が遅れました!idがnilになっているのが原因でした。解決できそうです。ありがとうございます。

show.ht,l.erbにて、<%= image_tag(@prototype.image, class: :card__img) %>に変更したら、undefined method `image' for nil:NilClassのNomethoderrorに変わりました。

0Like

Your answer might help someone💌