セッションまたはフラッシュでフォームのエラーを渡す方法は? 【レール2.3.5]

StackOverflow https://stackoverflow.com/questions/2573350

質問

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_filternewの両方のためのcreateでそれを呼び出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top