Предварительно заполните форму из связанного объекта при ошибке в Rails - PullRequest
0 голосов
/ 15 февраля 2011

У меня есть сообщение, которое has_many :comments и комментарий, belongs_to :post.В / posts /: id (метод post show) Я отображаю форму, где пользователи могут оставлять комментарии.

Все работает, проверки, тесты и публикация в порядке.Единственное, чего не хватает, это как повторно отобразить POST-данные об ошибках валидации .

(упрощенный) код для этого:

#app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.all_published(params[:page])
    @title = "Blog"
  end

  def show
    @post = Post.where({:published => true}).find(params[:id])
    @comment = Comment.new(:post => @post)
    @title = @post.title
  end
end

#app/controllers/comments_controller.rb
class CommentsController < ApplicationController
  def create
    @comment = Comment.new(params[:comment])
puts @comment

    if @comment.save
      flash[:notice] = 'Comment was successfully created.'
      redirect_to(@comment.post)
    else
      flash[:notice] = "Error creating comment: #{@comment.errors}"
      redirect_to(@comment.post)
    end
  end
end

#app/views/posts/show.haml
.html renders Post contents.

- form_for @comment do |f|
  = f.hidden_field :post_id
  = f.text_area :body
  = f.text_field :name
  .some more fields.

Я ожидаю, что решение будет либо в каком-то магическом объявлении в comments_controller.rb, часть

   else
      flash[:notice] = "Error creating comment: #{@comment.errors}"
      redirect_to(@comment.post)
    end

Или в PostsController.show, где я готовлю @comment.Должен ли я установить условие @comment и заполнить его некоторой магической переменной при ошибках?Или я совершил совершенно другую ошибку?

1 Ответ

1 голос
/ 15 февраля 2011

Если вы перенаправите эти данные, как правило, теряются, поэтому в большинстве случаев при действиях create create вы заметили бы, что в сценарии false render не redirect_to .

Так что вместо этого вы можете просто попробовать,

 flash[:notice] = ""Error creating comment: #{@comment.errors}"
 render :template => "posts/show"
 @post = @comment.post
 # you may need to pre-populate the instance variables used inside PostsController#show 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...