Подтвердите форму, вызванную через другой контроллер - PullRequest
1 голос
/ 21 февраля 2012

Я пишу блог-движок, поэтому у меня есть просмотр поста (show.html.erb), который показывает пост, список комментариев и форму комментариев.

Я называю форму следующим образом:

<%= render :partial => 'comments/form', :locals => {:comment => @post.comments.new} %>

Я не уверен, правильно ли передается комментарий, но по крайней мере я получаю post_id для нового комментария.

Это моя форма (_form.html.erb при просмотре комментариев):

<%= form_for comment, :action => "create" do |f| %>
    <% if comment.errors.any? %>
        <div id="error_explanation">
          <h2><%= pluralize(comment.errors.count, "error") %> prohibited this comment from being added:</h2>

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

  <%= f.hidden_field :post_id %>
  <p>
    <%= f.label :name %>
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :email %>
    <%= f.text_field :email %>
  </p>
  <p>
    <%= f.label :url %>
    <%= f.text_field :url %>
  </p>
  <p>
    <%= f.label :content %>
    <%= f.text_area :content %>
  </p>
  <p class="no-border">
    <%= f.submit "Post", :class => "button" %>
  </p>
<% end %>

И это действие:

  def create
    @comment = Comment.new(params[:comment])

    respond_to do |format|
      if @comment.save
        format.html { redirect_to :back }
      else
        format.html { redirect_to :back }
      end
    end
  end

Немного многословно, но я хочу добавить больше материала.

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

Я оставляю все пустыми (в моей модели есть средства проверки) и вижу, что комментарий, созданный в действии create , содержит ошибки и перехожу к else path.

Но ... Форма не показывает ошибок.

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

Итак, в чем проблема?

РЕДАКТИРОВАТЬ: Дополнительные вещи:

Я мой show.html.erb У меня также есть это (перед формой):

<ol class="commentlist">
  <%= render @post.comments %>
</ol>

Итак, когда в действии show я помещаю дополнительную переменную:

def show
  @post = Post.find(params[:id])
  @comment = @post.comments.new

Похоже, что рендер тоже хочет сделать пустой комментарий и сделать исключение.

Как это обойти?

1 Ответ

1 голос
/ 21 февраля 2012

Когда вы перенаправляете обратно, вы снова вызываете действие PostsController#show, которое сбрасывает все переменные экземпляра.Если вы хотите сохранить состояние после неудачного вызова CommentsController#create, вам нужно будет вызвать render 'posts/show' вместо redirect :back, чтобы повторно использовать переменные экземпляра, которые были объявлены в текущем действии

def create
   # assuming you have nested the comments routes underneath posts...
   @post = Post.find(params[:post_id])
   @comment = @post.comments.build(params[:comment])

   respond_to do |format|
      if @comment.save
         format.html { redirect_to :back }
      else
         format.html do
            # remember to declare any instance variables that PostsController#show requires
            # e.g. @post = ...
            render 'posts/show'
         end
      end
   end
end

YouТакже необходимо убедиться, что частичное использование @comment вместо создания нового комментария каждый раз

<%= render :partial => 'comments/form', :locals => {:comment => @comment } %>

И убедитесь, что PostsController объявляет @comment

# e.g. inside PostsController
def show
   @post = Post.find(params[:id])
   @comment = Comment.new
end

Самое важное, что нужно помнить, - это убедиться, что код внутри неудачного вызова create инициализирует все переменные экземпляра, которые требуются шаблону действия PostsController#show, в противном случае вы получите ошибки.

...