undefined метод `errors 'для # <Комментарий не может получить ошибки - PullRequest
0 голосов
/ 05 июля 2018

Итак, я получаю следующую ошибку:

undefined method `errors' for #<Comment::ActiveRecord_Associations_CollectionProxy:0x00007f1a3e2ecf48>

Я могу получить количество комментариев и тому подобное, однако я не могу отобразить ошибки валидации.

Вот что у меня есть в терминах моего кода

_new_comment

<% if signed_in? %>
  <div class="row">
    <%= form_with(model: [@product, @product.comments.build], local: true) do |f| %>
      <% if @product.comments.errors.any? %>
        <div id="error_explanation">
          <h2><%= pluralize(@product.comments.errors.count, "error") %> prohibited this comment from being saved:</h2>

          <ul>
          <% @product.comments.errors.full_messages.each do |message| %>
            <li><%= message %></li>
          <% end %>
          </ul>
        </div>
      <% end %>

comments_controller

class CommentsController < ApplicationController
  def create
    @product = Product.find(params[:product_id])
    @comment = @product.comments.new(comment_params)
    @comment.user = current_user
    @comment.save

    respond_to do |format|
      if @comment.save
        format.html { redirect_to @product, notice: 'Review was successfully created.' }
        format.json { render :show, status: :created, location: @product }
      else
        format.html { redirect_to @product, alert: 'Review was not saved successfully.' }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
  end

  private
    def comment_params
      params.require(:comment).permit(:user_id, :body, :rating)
    end
end

Любая помощь здесь приветствуется.

1 Ответ

0 голосов
/ 05 июля 2018

Вопросы

  • Вы не можете получить доступ к errors для объекта ActiveRecord::Relation, но для отдельных Comment объектов.
  • В вашем действии контроллера create вы делаете redirect_to(@product) при невозможности сохранить комментарий, который игнорирует уже созданный объект @comment и создает новый (через form_with(model: [@product, @product.comments.build])) при отображении формы комментария. Вместо этого вам нужно только render страница продукта с уже созданным @comment объектом.
  • У вас есть @comment.save дважды в вашем create действии.

Решение

products_controller.rb

def show
  # your current logic
  @comment = @product.comments.build
  # render
end

comments_controller.rb

class CommentsController < ApplicationController
  def create
    @product = Product.find(params[:product_id])
    @comment = @product.comments.new(comment_params)
    @comment.user = current_user

    respond_to do |format|
      if @comment.save
        format.html { redirect_to @product, notice: 'Review was successfully created.' }
        format.json { render :show, status: :created, location: @product }
      else
        format.html { render 'products/show', alert: 'Review was not saved successfully.' }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end

  private

  def comment_params
    params.require(:comment).permit(:user_id, :body, :rating)
  end
end

_new_comment.html.erb

<%= form_with(model: [@product, @comment], local: true) do |f| %>
  <% if @comment.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@comment.errors.count, "error") %> prohibited this comment from being saved:</h2>

      <ul>
        <% @comment.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
<% end %>
...