我有一个显示书籍的页面,这是很多评论。在此页面上还有一个表单,用于编写新评论并将其发布到评论控制器的创建操作。当您发布表单时,也会发送相应书籍的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
当然,当审核无法保存时(例如审核内容是强制性的)我想回到图书展示页面并向用户显示表单和错误。现在我可以解决,这里有两种可能性:
解决这个问题的最佳方法是什么?
答案 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吗?