実際、リダイレクトはここに行く方法ではないと思います。Rails でのエラーと検証の処理は、通常、実際にorページにリダイレクトするのではなく、検証済みのオブジェクトを使用してcreate
orメソッドでフォームを再レンダリングする方法で機能します。update
new
edit
2 つのバージョンのコメント保存に関する問題についてはform_for @comment
、両方のバージョンで使用します。ネストされたフォーム バージョンをダンプして、フォーム内の特定の記事文字列を使用してユーザーの動作をシミュレートします。このようにして、多くの if-else ステートメントを省くことができます。
検証エラー部分でのレンダリングに関しては、params に 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 %>
お役に立てれば。