проверяет длину комментария, но без сообщения об ошибке

#ruby-on-rails #ruby #ruby-on-rails-3

#ruby-on-rails #ruby #ruby-on-rails-3

Вопрос:

Для начала прошу прощения за мой английский 🙂

Ну, я на самом деле изучаю Rails с помощью простого приложения, знаменитого блога.

Вот фактическая схема базы данных :

 create_table "comments", :force => true do |t|
t.integer  "post_id"
t.text     "text"
t.datetime "created_at"
t.datetime "updated_at"
end

create_table "posts", :force => true do |t|
t.string   "title"
t.text     "text"
t.datetime "created_at"
t.datetime "updated_at"
end
 

Модель публикации :

 class Post < ActiveRecord::Base 
    has_many :comments

    validates_presence_of :title, :message => "title is mandatory"
    validates :text, :length => { :minimum => 10 }
end
 

И когда я пытаюсь создать сообщение с текстом <= 10 символов, как и ожидалось, сообщение не сохраняется, и я получаю сообщение об ошибке (по умолчанию).

Поэтому я попытался сделать то же самое с комментарием…

Модель комментария :

 class Comment < ActiveRecord::Base
     belongs_to :post
     validates :text, :presence => true, :length => { :minimum => 10 }        
end
 

И мой CommentsController :

  class CommentsController < ApplicationController
  def create
   @post = Post.find(params[:post_id])
   @comment = @post.comments.build(params[:comment])
   @comment.save

   redirect_to @post
  end

  def destroy
   @comment = Comment.find(params[:id])
   @comment.destroy

   redirect_to @comment.post
  end
end
 

Я знаю, что проверка выполняется, потому что я не могу создать комментарий с содержимым <= 10 символов, однако я не получил сообщение об ошибке, как ожидалось. И это то, что я пытаюсь получить…

Спасибо.

Комментарии:

1. откуда вы знаете, что сообщения об ошибке нет? вы пробовали это через консоль? Я подозреваю, что, поскольку вы перенаправляете на @post , вы отображаете представление Post#show действия, которое может не обрабатывать сообщение об ошибке для связанных объектов.

2. Как я мог обработать сообщение об ошибке для этого внутреннего сообщения #show?

3. как вы отображаете сообщения об ошибках?

4. eduke если вы хотите обработать сообщение об ошибке, вы должны использовать следующий фрагмент кода. Это должно сработать.

Ответ №1:

Попробуйте следующий код :

 def create
   @post = Post.find(params[:post_id])
   @comment = @post.comments.build(params[:comment])
   begin
    @comment.save!
     redirect_to @post
    rescue Exception => error
     puts "Error:: #{error.message}"
     render : new #to not redirect
    end
 

Ваша ошибка будет помещена на вашу консоль.

Если вы хотите увидеть эти ошибки в представлении, добавьте это в свой «новый»

 <div>
  <% 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 |msg| %>
              <li><%= msg %></li>
          <% end %>
        </ul>
      </div>
  <% end %>
</div>