#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>