Не найдено ни одного маршрута, поэтому я не могу отображать свои комментарии на странице шоу. - PullRequest
0 голосов
/ 17 апреля 2019

Здравствуйте. Я пытаюсь отобразить свои комментарии на странице шоу.

Я создал контроллер комментариев и отобразил страницу для отображения комментариев на странице шоу, однако при создании комментария я получаю ошибку маршрутизации.Пожалуйста, смотрите сообщение об ошибке ниже:

сообщение об ошибке: 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 голосов
/ 17 апреля 2019

Ни в коем случае вы не связываете комментарий с прической, поэтому, когда вы пишете

def create
  `…`
  redirect_to hairstyle_path(@comment.hairstyle)
end

@comment.hairstyle - ноль, следовательно, ваша ошибка.

Обновите ваш метод создания следующим образом, и он должен это сделать

def create
  @hairstyle = Hairstyle.find(params[:hairstyle_id])
  @comment = @hairstyle.comments.new(comment_params)
  @comment.save
  redirect_to hairstyle_path(@comment.hairstyle)
end
0 голосов
/ 17 апреля 2019

Это сообщение об ошибке, которое указывает на вашу проблему.

No route matches {:action=>"show", :controller=>"hairstyles", :id=>nil}, 
missing required keys: [:id]

Он пытается перейти к действию show в контроллере причесок без параметра ID. Почему он пытается туда попасть?

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

Это должно вот-вот исправить.

Конечно, вам нужно убедиться, что вы передаете все правильные параметры по пути. Мне было сложно тестировать ваши модели, потому что все требуется вам. Лично мне нравится, чтобы все было просто. Только требуют того, что абсолютно необходимо. Все остальное должно быть оставлено на усмотрение пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...