セッションまたはフラッシュでフォームのエラーを渡す方法は? 【レール2.3.5]
-
24-09-2019 - |
質問
I有し、潜在的にエラー(即ち、第1名が欠落している)、その後、リダイレクトを生成するフォームのアクションを作成します。
問題は、リダイレクトが発生したときに、それらの形状誤差が迷子こと、です。 どのように私は(まだ元のerror_messages行動のように、以前の内容を記入しなければならない)元の形?
に戻って表示されるセッションにおけるそれらの形状誤差を渡すことができますありがとうございます。
<時間>コード
def create
@contact = Contact.new(params[:contact])
if @contact.save
flash[:notice] = "Sent."
else
flash[:notice] = "Error."
end
end
解決
これは私が自分自身とのトラブルを持っていたというトリッキーな問題です。私が尋ねる最初の質問は、あなたがエラーを検出したときにリダイレクトする必要がありますなぜですか?エラーがあるアクションをレンダリングするためにあなたを強制することは、複雑さと使いやすさの問題にRailsフレームワークの設計者の意識的な決断だった。
ここに大きな問題がありますので、あなたのアクションで、あなたがのparamsを使用してモデルのインスタンスを作成し、オブジェクトの検証が失敗し、別のアクションにリダイレクトすることを決定しました。 FOO:あなたがセッションにあなたのモデルインスタンスの現在の状態を保存して、アクションにリダイレクトする必要があります別のアクションにリダイレクトする前に。アクションで:FOOあなたは属性を更新し、インスタンス変数を経由してビューにエラーを渡すために再試行する必要があると思います。ここでの問題は、あなたが悪いこと(1つのアクションは他に依存している)である、あなたのコントローラのアクションをカップリングしていることです。そこで私は、およそ永遠に入力することができ、他の問題のホストがありますが、一つだけのリソースのためにこれを行うために必要がある場合は、ここで私はそれを行うだろう方法は次のとおりです。
のconfig / routes.rbを
map.resources :things, :member => { :create_with_errors => :get }
things_controller.rb
def new
@thing = Thing.new
end
def create
@thing = Thing.create(params[:thing])
if @thing.save
redirect_to things_path
else
session[:thing] = @thing
redirect_to create_errors_thing_path(@thing)
end
end
def create_with_errors
@thing = session[:thing]
@errors = @thing.errors
render :action => :new
end
アプリ/ビュー/もの/ new.html.erb
<% if defined?(@errors) %>
<% #do something with @errors to display the errors %>
<% end %>
<!-- render the form stuff -->
私は、これは恐ろしいです何をしている思考...知っています。信託私は、私はこの問題に対処しようとする試みの多くを作ったと私は、レールの開発者が選択したメカニズムがエラーに対処するための最善かつ最も簡単な方法です実現するために来てます。
他のヒント
Railsのでは慣例では、リダイレクトを行うのではなく、元のアクションのビューをレンダリングすることです。だからあなたのコードは次のようになります:
def create
@contact = Contact.new(params[:contact])
if @contact.save
flash[:notice] = 'Sent.'
redirect_to @contact
else
flash.now[:notice] = 'Error.'
render :new
end
end
new
アクションのために行われるために必要な任意の追加の設定がある場合は、は、プライベートメソッドに共通のコードを抽出し、before_filter
とnew
の両方のためのcreate
でそれを呼び出します。