如何将表单错误发送回他们来自哪里?

时间:2011-02-23 09:16:59

标签: ruby-on-rails ruby-on-rails-3

我有一个显示书籍的页面,这是很多评论。在此页面上还有一个表单,用于编写新评论并将其发布到评论控制器的创建操作。当您发布表单时,也会发送相应书籍的ID,以便正确建立关系。

在评论控制器中,我们尝试保存评论。这是我的控制器的样子:

def create
    @review  = current_user.reviews.build(params[:review])
    @book = Book.find_by_ean params[:book]
    @review.book = @book

    if @review.save
      redirect_to book_path(@book)
    else
      # In here I want to go back to book_path(@book), sending @review with it so that I can have access to @review.errors
    end
  end

当然,当审核无法保存时(例如审核内容是强制性的)我想回到图书展示页面并向用户显示表单和错误。现在我可以解决,这里有两种可能性:

  1. 渲染“books / show”,:review => @review ---这确实会发回带有错误的评论(我认为,不是100%),但URL保持为“/评论”,这会导致大量的问题。例如,我在“/ books”目录中保留的部分内容无法找到。
  2. redirect_to book_path(@book)---这确实让我回到正确的URL,但它没有发送@review,所以我无法显示错误消息。
  3. 解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

我通常通过将psot数据发送到原始控制器(在本例中为books)中的成员操作而不是嵌套控制器来解决此问题。例如:

# routes.rb
resources :books do
  member do
    post 'create_review'
  end
end

然后在你看来

# books/show.html.erb
<%= form_for @new_review, :url => create_review_book_path(@book) do |f| %>
...
<% end %>

最后在你的书籍控制器中

# books_controller.rb
def create_review
  @book = Book.find(params[:id])
  @new_review = @book.reviews.build(params[:review])
  if @new_review.save
    @new_review = Review.new
  end
  render :action => :show
end

所发生的情况是表格已被手动指示将其数据发布到图书控制器中的新成员路线。如果成功保存了审阅,则我们会为变量分配新的审阅对象,以便为下一次审核做准备。如果它不成功,那么@new_review变量将包含可以在表单中访问的错误。

答案 1 :(得分:0)

好吧,你不能真正通过get params(带有重定向)传递一个对象,除非你序列化它并且你不想要它。

我看到两个解决这个问题的方法。 1)将评论保存在书籍控制器中 2)通过ajax提交表单,并使用“render:update”

更新审阅控制器中的表单

我不知道哪一个是最好的,这个项目规格的依赖,比如你能用ajax吗?