没有路线匹配,因此我无法在显示页面上显示我的评论

时间:2019-04-17 14:00:09

标签: ruby-on-rails ruby

你好,我想在我的节目页面上显示我的评论。

我已经创建了注释控制器,并渲染了一个页面以在显示页面上显示注释,但是当我创建注释时,出现了路由错误。请查看以下错误:

错误消息: 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

提前感谢:)

2 个答案:

答案 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

编辑,看到回购后,我可以找到问题并进行整理。

快速提示:

  1. 您的日志没有告诉您模型验证失败的原因。因此,您要确保在开发中正在运行它,捕获错误并记录错误。 (例如,您可以使用save!而不是save来确保它引发错误。
  2. 您的代码有点麻烦。我建议阅读Ruby on Rails的最佳实践。您的仓库中确实还应该有测试。

解决方案(据我可以不做全部测试):

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