实际上重定向不是去这里的方式,我会说。create
Rails 中的错误和验证处理通常采用在or方法中使用经过验证的对象重新呈现表单的update
方式,而不是实际重定向到new
oredit
页面。
至于您保存两个版本的评论的问题,我会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 %>
希望这可以帮助。