2016-08-10 11 views
0

私はデータをリストし、新しいレコードを(部分的に)作成できるビューを持っています。問題は、フォームがインデックスアクションの下に存在するため、リダイレクト時にユーザー入力が無効な場合、フォームのデータを失うことです。Rails 4リダイレクト時にフォームデータを保存する方法

私はデータを保持したいので、ユーザーはそれをもう一度入力する必要はありません。

コントローラー:

def index 
    @instance = Instance.new 
end 

def create 
    w = current_user.workspaces.find_by_id(params[:"..."] 
if w.present? 
    @instance = current_user.workspaces.find_by_id([:"..."]).instances.create(...) 
    [:info] = "Please check your email to activate your account." 
     redirect_to root_url   
    else 
     flash[:info] = "Please check your data" 
     redirect_to root_url 
    end 

end 

index.html.haml

= render :partial => 'partial1' 

partial1.html.haml

= form_for @instance , url: {action: "create"} do |f| 

私は 'レンダリング' 形式のデータを保持しますが、やっていることを知っています:

def create 
    if something 
     ... 
    else 
     flash[:info] = "Please check your data" 
     render :index 
    end 

end 
01 {アクション: "作成"}私は、フォーム内のエラー

最初の引数がnilを含んでいたり

=のform_for @instance、URL空にすることはできません取得

| fを行います|

どうすれば修正できますか? 私はすでにindexアクションに書かれたコードを、繰り返すことになるため、この

def create 
... 
flash[:info] = "Please check your data" 
@instance = Instance.create 
render :index 

のように、アクションを作成するに@instanceを初期化する必要はありません。


それをラップする:

を私は複雑なコントローラと、部分的なフォームを持っている複雑なインデックスを眺めることができます。 Iレンダリングできません:すべてのインデックスのインスタンス変数をロードする必要があるため、作成アクションのインデックス。 データが正しくない場合、ネストされたフォームがあるので、@instance変数を作成できません。私が作成したアクションに@instanceを初期化する必要はありません

+0

を[ :instance])を使用すると、あなたは既に変数を持っていて、 'render:index'を使うとエラーが消えてしまいます。 – fanta

+0

'@instance = Instance.new'は、フォームのユーザ入力をインスタンス化するためだけに' @ instance'をインスタンス化します。オブジェクトを作成していません。ですから、あなたの 'コントローラ'では、その情報、つまりparamsを取得し、 'Instance.create'と' save'を使用しなければならないので、コードを繰り返す必要はありません。 – mrvncaragay

+0

ユーザの入力が無効なときにデータを保持したい場合は、 'redirect_to root_url'の代わりに' render index'を使用してください – mrvncaragay

答えて

0

...

さて、あなたがすべきは、インスタンスをしたいからです。ただし、フォームに入力されたパラメータで '初期化'してください。作成しないでください。だから、ような何か:私たちは「を作成」アクションをコーディングするとき、私たちは通常、このような場合には、インスタンスオブジェクトをオブジェクトを構築し、そう、我々は通常@instance = Instance.new(のparamsのような何かをするだろう

def create 
... 
flash[:info] = "Please check your data" 
@instance = Instance.new(params[:instance]) 
render :index 
+0

問題は、ネストされたフォームがあるため、すべての要件が満たされない限りインスタンスを初期化できないことです。私はコードを更新しました – Gaston

+0

私はコードaswelを更新しました。あなたはこれを行うことができるはずです。これを行うことで、データベースに保存するのではなく、入力されたパラメータを「覚えている」ことになります。 –

関連する問題