你好,我想在我的节目页面上显示我的评论。
我已经创建了注释控制器,并渲染了一个页面以在显示页面上显示注释,但是当我创建注释时,出现了路由错误。请查看以下错误:
错误消息:
No route matches {:action=>"show", :controller=>"hairstyles", :id=>nil}, missing required keys: [:id]
我想要的行为是当用户创建评论时将其重定向到显示页面并显示评论。
提前谢谢!
评论控制器:
class CommentsController < ApplicationController
def new
@hairstyle = Hairstyle.find(params[:hairstyle_id])
@comment = Comment.new
end
def create
@comment = Comment.new(comment_params)
@hairstyle = Hairstyle.find(params[:hairstyle_id])
@comment.save
redirect_to hairstyle_path(@comment.hairstyle)
end
def destroy
end
end
private
def comment_params
params.require(:comment).permit(:content)
end
显示页面:
show.html.erb
<div class="container">
<div>
<%= cl_image_tag @hairstyle.photo, width: 300, height: 200, crop: :fill %>
<h1><%= @hairstyle.name %></h1>
<p><%= @hairstyle.description%></p>
<p><%= @hairstyle.category%></p>
<p><%= @hairstyle.video_url %></p>
</div>
</div>
<div>
<%= link_to 'Back', hairstyles_path %>
</div>
<h6>Comments for: <%= @hairstyle.name %> <small><%= %></small></h6>
<h2>
<%= pluralize @hairstyle.comments.size, "comment" %>
</h2>
<div id="comments">
<% if @hairstyle.comments.blank? %>
Be the first to leave a comment for <%= @hairstyle.name %>
<% else %>
<% @hairstyle.comments.each do |comment| %>
<%= render 'comments/show', comment: comment %>
<% end %>
<% end %>
</div>
<%= render 'comments/form', comment: @comment %>
上面显示的评论/显示页面:
<p><%= comment.content %></p>
路线:
Rails.application.routes.draw do
root to: 'pages#home'
devise_for :users
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
resources :hairstyles do
resources :comments, only: [:new, :create ]
resources :saved_hairstyles, only: [:new, :create]
end
resources :saved_recipes, only: :destroy
resources :comments, only: :destroy
resources :hairdressers
end
提前感谢:)
答案 0 :(得分:0)
这是表明您的问题的错误消息。
No route matches {:action=>"show", :controller=>"hairstyles", :id=>nil},
missing required keys: [:id]
它正在尝试在没有ID参数的 hairstyles 控制器中转到 show 动作。为什么要去那里?
def create
@comment = Comment.new(comment_params)
@hairstyle = Hairstyle.find(params[:hairstyle_id])
@comment.save
redirect_to hairstyle_path(@comment.hairstyle) # this line
end
@comment
没有发型。您需要使用以下内容添加关联:
def create
@comment = Comment.new(comment_params)
@hairstyle = Hairstyle.find(params[:hairstyle_id])
@hairstyle.comments << @comment
@comment.save
redirect_to hairstyle_path(@comment.hairstyle)
end
编辑,看到回购后,我可以找到问题并进行整理。
快速提示:
save!
而不是save
来确保它引发错误。解决方案(据我可以不做全部测试):
在hairstyle.rb
模型中,您具有以下几行:
validates :content, presence: true
validates :content, length: { minimum: 20 }
但是Hairstyle
没有内容字段。因此,马上行动,您将无法保存任何发型(至少我无法保存)。
在comment.rb
模型中,您有以下一行:
belongs_to :hairdresser
但是在您的架构中,Comment
没有hairdresser_id
字段。因此验证失败,因为抛出了Hairdresser must exist
。但是,当我包括一个美发师时,它会抛出(can't write unknown attribute hairdresser_id)
。因此,您将要运行此迁移:
rails g migration AddHairdresserToComments hairdresser:references
那应该解决它。
当然,您需要确保一路传递所有正确的参数。我很难测试您的模型,因为您需要一切。就个人而言,我喜欢保持简单。 仅要求绝对必要。其他一切都应该留给用户。
答案 1 :(得分:0)
在任何时候您都不会将评论与发型相关联,因此在撰写时
def create
`…`
redirect_to hairstyle_path(@comment.hairstyle)
end
@ comment.hairstyle为nil,因此是您的错误。
将您的create方法更新为以下内容,并且应该这样做
def create
@hairstyle = Hairstyle.find(params[:hairstyle_id])
@comment = @hairstyle.comments.new(comment_params)
@comment.save
redirect_to hairstyle_path(@comment.hairstyle)
end