2011-07-16 5 views
4

現在、さまざまなRailsチュートリアルを進めていますが、エラーが発生したフォームを出力するにはレンダリングを使用することをお勧めします。たとえば、作成方法は次のようになります。Ruby on Railsで失敗したフォーム提出のURLを保持する

def create 
    @user = User.new(params[:user]) 
    if @user.save 
    flash[:success] = "Welcome to the Sample App" 
    redirect_to @user 
    else 
    @title = "Sign up" 
    render 'new' 
    end 
end 

これは、所望の効果を持っていますが、私はhttp://localhost:3000/users/newで新しいユーザーフォームを持っているとエラーが発生した場合、私はhttp://localhost:3000/users

でエラーが発生した同じフォームを得ることを意味

代わりにhttp://localhost:3000/users/newに行くように確認する方法はありますか?

レンダリング 'new'の代わりにリダイレクトを使うことを考えましたが、これはフォームエラーの表示に問題を引き起こします。 RailsのIRCの誰かが私にクライアント側検証の方法を指示しましたが、それは問題を避けているようです。

+1

正直なところ、この動作が問題であるとは思われません。 – Wukerplank

+0

私はそれが私のものだと確信していますが、それはちょうど正しいように見えません。起こりそうもない仮説的なシナリオですが、「誰かが私にこのページではすべきではないエラーが表示されます」というメールを私に送ってURLをコピーして貼り付けた場合、どうなりますか? – RobL

答えて

2

私のユーザー登録フォームにも同様の問題がありました。

resources :users, :except => [:new, :create] do 
    ... 
end 
get "/signup" => "users#new" 
post "/signup" => "users#create" 

と新しいフォームで:私はそこにRESTfulなルートを使用していないので、私は以下のルートでそれを解決することができました

form_for @user, :url => signup_path do ... 
(単なる6年)遅刻のため申し訳ありません
+0

ありがとう!それがルーティングの問題であるかどうか疑問に思った。これと一緒に行くだろうが、それはそれを修正する必要があるように見えます! – RobL

1

テイクredirect_to :action => 'new'レンダリングではなくURLを保持しますが、エラーに関する情報は失われます(flashに入れない限り)。

もう1つの方法は、フォームの表示に使用するURLにフォームを送信することです。アクションの開始時に、処理する必要のあるデータがあるかどうかをチェックします。処理がうまくいけば、別の場所にあるredirect_toになります。それ以外の場合は何もしません。フォームがすべてのエラーとともに表示されます。これはRailsyほどではありませんが、あなたが望むように動作するはずです。

+0

ありがとう! 2番目のオプションが役に立ちます。私は必ずしもRails-yであるとは限りませんが、少なくともこの問題に対処すべきです。 – RobL

1

しかし、どういうわけかこれはTurbolinksの問題であるようです。

hereおよびhereを参照してください。

関連する問題