0

記事モデルとコメントモデルがあります。現在、新しいコメントを作成するための2つの別々のフォームがあります。1つはユーザーがコメントの対象となる記事の名前を指定できるフォームで、もう1つはその記事の新しいコメントを作成する記事ショービューの下にあります。最初のケースではform_for@commentを使用し、2番目のケースではform_for [@ article、@comment]を使用しています。ユーザーが記事名を文字列として指定すると、コメントを保存する前に記事IDに変換します。

私のルートは

resources :comments

resources :articles do
  resources :comments 
end

2番目のフォームでは、コメントの保存に失敗した記事にリダイレクトするにはどうすればよいですか(検証とエラーが表示されます)。最初のフォームでは、最初のコメントフォームがあるホームページにリダイレクトします。

また、最初のフォームで、記事名フィールドを空にすることはできないという検証があります。ユーザーが記事名を指定する必要がないため、2番目のフォームのこの検証を削除するにはどうすればよいですか?

Comments_controllerの新しい関数は、両方の形式を処理します。コントローラで送信されているフォームを確認するにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

2

実際、リダイレクトはここに行く方法ではないと思います。Rails でのエラーと検証の処理は、通常、実際にorページにリダイレクトするのではなく、検証済みのオブジェクトを使用してcreateorメソッドでフォームを再レンダリングする方法で機能します。updatenewedit

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 %>

お役に立てれば。

于 2012-10-19T08:15:03.820 に答える