Как отобразить сообщения об ошибках для проверки вложенных ресурсов? - PullRequest
1 голос
/ 15 октября 2010

Я создаю базовое приложение для блога, и у меня возникают проблемы с отображением сообщений об ошибках, когда пользователь пытается отправить пустой комментарий.Вместо того, чтобы получить красивое сообщение об ошибке, сообщение об ошибке активной записи с правильными ошибками проверки.Такие какActiveRecord::RecordInvalid in CommentsController#createValidation failed: Name can't be blank, Email can't be blank

В моем представлении статьи / шоу у меня есть следующий код:

<%= form_for([@article, @article.comments.build]) do |f| %>
  <%= render "shared/error_messages", :target => @article %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <p><%= f.submit %></p>
<% end %>

Мои сообщения об ошибках частично выглядят так:

    <% if target.errors.any? %>
       <div id="error_explanation">
         <h2><%= pluralize(target.errors.count, "error") %> prohibited this record from                 being saved:</h2>

    <ul>
      <% target.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
<% end %>

Я знаю, что ответ прост, но я не могу понять его.

Создать действие в контроллере комментариев:

def create
@article = Article.find(params[:article_id])
@comment = @article.comments.build(params[:comment])
respond_to do |format|
  if @comment.save
    format.html { redirect_to(@article, :notice => 'Comment was successfully created.') }
    format.xml  { render :xml => @article, :status => :created, :location => @article }
  else
    format.html { render :action => "articles/show" }
    format.xml  { render :xml => @comment.errors, :status => :unprocessable_entity }
  end
end

Ответы [ 3 ]

4 голосов
/ 13 июня 2012

У меня была похожая проблема. казалось, все работает нормально, но я не получаю никаких ошибок Решение, которое я нашел, состоит в том, чтобы создать комментарий в статье # show вместо представления:

@article = Article.find(params[:id])
@comment = @article.comments.build(params[:comment])

и в ваших статьях # show не используйте @ article.comments.build, а @comment:

<%= form_for([@article, @comment]) do |f| %>
   <%= render 'shared/error_messages', :object => f.object %>
   <p><%= f.submit %></p>
<% end %>

убедитесь, что вы строите комментарий в своем комментарии # создайте также (у вас действительно нет выбора: P)

также, я не знаю, имеет ли это значение (я довольно плохо знаком с ruby), но я думаю, что вам нужно передать f.object вместо @ comment.

2 голосов
/ 15 октября 2010

Я думаю, вы говорите, что получаете большую страницу ошибки серого на белом, верно?

Проверьте обратную трассировку, но я подозреваю, что это происходит из-за действия create в контроллере, а не представление.

Если ваш контроллер использует save! с ! в конце, это означает, что возникнет ошибка, если запись недействительна.save, с другой стороны, возвращает true или false и позволяет вам использовать простую логику ветвления, чтобы решить, как реагировать.

Если моя догадка о save! не верна, пожалуйста, напишите код контроллератак что мы можем копать глубже :) Спасибо!

1 голос
/ 15 октября 2010

Решением было направить созданное в комментарии действие обратно к правильному контроллеру / action и target @comment в моем частичном сообщении об ошибке.

Окончательный просмотр

    <%= form_for([@article, @article.comments.build]) do |f| %>
  <%= render "shared/error_messages", :target => @comment %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <p><%= f.submit %></p>
<% end %>

Окончательное создание действия вконтроллер комментариев

def create
    @article = Article.find(params[:article_id])
    @comment = @article.comments.build(params[:comment])
    respond_to do |format|
      if @comment.save
        format.html { redirect_to(@article, :notice => 'Comment was successfully created.') }
        format.xml  { render :xml => @article, :status => :created, :location => @article }
      else
        format.html { render :action => "articles/show" }
        format.xml  { render :xml => @comment.errors, :status => :unprocessable_entity }
      end
    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...