2012-01-08 11 views
16

私はポストモデルで検証された「新しい」フォームを持っています。バリデーターがキックインすると、正しく表示されません。レンダリング:検証後に正しい場所に移動しません。

新しい投稿ページのパスが「新しい/投稿/」検証で

であり、新しいポストのページのパスは、私はそれが戻って行く必要がある..「/ポスト」である「/ポスト/新しいです」 。

これは私のコントローラです:

def create 
@post = current_user.posts.build(params[:post]) 
if @post.save 
    redirect_to public_post_page_path(@post.public_url) 
else 
    render :action => :new 
end 
end 

私はそれが私のフォームで行う必要があります感じています。したがって、ここにformtastic最初の行です:

<%= semantic_form_for [:student, post], :html => {:id => "post_form"} do |form| %> 

答えて

11

これはレールからの正しい動作です。

作成アクションでは、単に「新しい」ビューファイルをレンダリングします。したがって、URLは/ postsになりますが、ビューはフォームを正しく表示します。この動作には何も問題はありません。一般的にレールコンベンションは良い形です。また、レンダリングされたばかりのレールエラーは新しいものをレンダリングするだけで動作します。リダイレクトすると表示されません。

あなたが使用する必要があり、そのURLに戻りたいようにあなたが本当に感じる場合

:代わりに、レンダリングの
redirect_to 

+1

私はエラーを表示したいので、レンダリングする必要があります。私が/ posts/newに戻す必要がある理由は少し複雑です。しかし、基本的には、 'def new'のコントローラーでは、フォームの一部を表示するかどうかを決定するユーザーのtwitter検証をチェックします。 '/ posts'に行くと、私はこの検証を失います。 私は、レンダリング後に新しいコントローラにコードをリロードする方法があるのでしょうか? – Marc

+3

新しい設定を行うためのプライベートコントローラメソッドを作成し、newとcreateから呼び出す前に、 – house9

+0

@Marc Railsをレンダリングする前に、/ postsを作成するための/ POSTに 'POST 'を実行します。あなたはいつでも/ posts/newに投稿することにより、この大会に違反することができます。 –

0

検証に失敗した場合は、エラーのあるフォームが表示され、/posts/newにとどまります。それはあなたが望むものです、そうですか?

これを実現する簡単な方法があります。

URLが進まないようにフォームにremote: trueを設定してください。 ajax:successを処理して、ページ上のフォームを新しくレンダリングされたフォームに置き換えます。

$('form[data-remote=true]').on 'ajax:success', (e, data, status, xhr) -> 
    if isHTML(data) 
    thisForm = "form[id=#{@getAttribute('id')}]" 
    $(thisForm).replaceWith $(data).find(thisForm) 

isHtml()機能がthis questionからです。

関連する問題