NameError in Prototypes#show
解決したいこと
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