2012-11-13 9 views
14

私は、リモート=>真でDBに行を追加するフォームを持っています。新しいデータをテーブルに追加したいのですが、レンダリングするための正しいビューを取得できません。コントローラから部分的にレンダリングする

今のところ、新しいエントリのshow.html.erbページ全体がレンダリングされていますが、レイアウトとして最低限のバージョンをaとして追加したいと考えています。 dbに挿入した後にレンダリングするビューをコントローラに知らせる簡単な方法はありますか?私は

マイコントローラー

def new 
    @task = Task.new 
    render :partial => "/tasks/newly_added", :locals => { :t => @task } 
    end 

おかげ_newly_added.html.erbという名前の私の部分をレンダリングしたいです!

EDIT 私が必要とするのは、代わりの「ショー」ビューです。

は私が変更するために必要な方法は、実際にこのことがわかった:

def create 
    @task = Task.new(params[:task]) 

    respond_to do |format| 
     if @task.save 
     format.html { redirect_to @task, notice: 'Task was successfully created.' } 
     format.json { render json: @task, status: :created, location: @task } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @task.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

は、私はちょうど代替ショーのビューを作成し、そのビューをredirect_toするためにこれを伝える必要があります。

+0

'tr'という行の一部だけを持ち、その中に新しいオブジェクトをレンダリングすることができます。次に、Ajax呼び出しの応答データを取得し、テーブルに生成されたhtmlを配置するだけです。このレスポンスを使用するには、レイアウトを持たずに特定の部分を使用する – MrYoshiji

答えて

11

質問の変更ごとに編集されます。しかし、何も変わりません。あなたは間違ったことを考えており、あなたの考え方を調整する必要があります。代替ショーは必要ありません。format.jsリクエストを処理する必要があります。

パーシャルは、コントローラではなくJavaScriptレスポンス内でレンダリングする必要があります。コントローラは、より次のようになります。

def create 
    @task = Task.new(params[:task]) 

    respond_to do |format| 
     if @task.save 
     format.html { redirect_to @task, notice: 'Task was successfully created.' } 
     format.json { render json: @task, status: :created, location: @task } 
     format.js 
     else 
     format.html { render action: "new" } 
     format.json { render json: @task.errors, status: :unprocessable_entity } 
     format.js 
     end 
    end 
    end 

を次に、ビュー/タスク/ create.js.coffeeここで何が起こっている

($ '#mytable').append("<%= j render(partial: 'tasks/newly_added', locals: { t: @task }) %>") 

は、ブラウザがcreate.jsを呼び出しますということです。コントローラーはrespond_toブロックformat.jsのため、create.jsテンプレートで応答します。 j_newly_added.html.erbファイルの内容をエスケープし、その内容はテーブルに追加されます。コントローラは既存のビューと対話しません。代わりに、JavaScriptがブラウザに送信され、ビューと対話します。

これは、BackboneやEmberのようなクライアント側のMVCフレームワークを使用している場合は多少変更されていますが、これを指定していないので、在庫Railsを使用していると仮定しています。

+0

私は元の質問にいくつかの編集を加えましたが、私は今何が起こるべきかを知っていますが、構文を理解することはできません。 – nathan

+0

新規作成と同様、作成も同様です。本当に変化するものはありませんが、私はあなたの編集した質問に対する答えを調整しました。 –

+0

私はそれを早めにしようとしましたが、あなたのポストを見てそれを修正し、それはトリックでした。ありがとう! – nathan

関連する問題