0

我有一个文章模型和一个评论模型。我目前有两种单独的表单来创建新评论:一种允许用户指定他们评论的文章名称,另一种是在文章显示视图下为该文章创建新评论。我在第一种情况下使用 form_for @comment,在第二种情况下使用 form_for [@article, @comment]。当用户将文章名称指定为字符串时,我在保存评论之前将其转换为文章 ID。

我的路线是

resources :comments

resources :articles do
  resources :comments 
end

对于第二种形式,如何在评论保存失败时重定向回文章(应显示验证和错误)?对于第一个表单,我只是重定向到主页,因为那是我的第一个评论表单所在的位置。

另外,我在第一个表单上验证了文章名称字段不能为空。由于用户不需要指定文章名称,如何删除第二个表单的此验证?

我在 comments_controller 中的新函数处理了这两种形式。如何确定控制器中提交的表单是什么?

提前致谢。

4

1 回答 1

2

实际上重定向不是去这里的方式,我会说。createRails 中的错误和验证处理通常采用在or方法中使用经过验证的对象重新呈现表单的update方式,而不是实际重定向到neworedit页面。

至于您保存两个版本的评论的问题,我会form_for @comment在两个版本中使用。转储嵌套表单版本使用表单中给定的文章字符串模拟用户的行为。这样你就可以省去很多 if-else 语句。

至于验证错误部分的渲染,您可以简单地检查您的参数中是否有 article_id(这意味着您通过给定文章创建/更新评论)或没有(这意味着您拥有第一个版本)。

一些代码来详细说明:

# routes.rb
# keep the routes as they are
resources :comments
resources :articles
  resources :comments
end

# CommentsController.rb
def new
  # don't use build
  @comment = Comment.new

  # get the article, if there is one to get
  @article = Article.find(params[:article_id]) if params[:article_id]

  # get all articles if there is no single one to get
  @articles = Article.all unless params[:article_id]
end

def create
  # fetch article id from title (in any case)
  # I'm assuming here
  params[:comment][:article_id] = fetch_article_id_from_title(params[:comment][:article_title])

  @comment = Comment.new(params[:comment])
  if @comment.save
    redirect_to everything_worked_fine_path
  else
    # render the new view of the comments and actually
    #  forget the article view. Most sites do it like this
    render action: "new"
  end
end

# form partial
<%= form_for @comment do |f| %>
  <% if @article %>
    # there's an article to save this comment for
    <%= f.hidden_field :article_title, @article.title   # I'm assuming here
  <% else %>
    # this means there's no particular article present, so let's
    # choose from a list
    <%= f.select ... %>
  <% end %>
<% end %>

希望这可以帮助。

于 2012-10-19T08:15:03.820 回答