Remote => trueを介してDBに行を追加するフォームがあります。次に、新しいデータをテーブルに追加したいのですが、レンダリングする正しいビューを取得できません。
現在のところ、新しいエントリのshow.html.erbページ全体がレンダリングされていますが、として追加される最小バージョンをレイアウトしたいと思います。データベースに挿入した後にレンダリングするビューをコントローラーに指示する簡単な方法はありますか? _newly_added.html.erbという名前のパーシャルをレンダリングしたい
私のコントローラー
def new
@task = Task.new
render :partial => "/tasks/newly_added", :locals => { :t => @task }
end
ありがとう!
[〜#〜] 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するように指示する必要があります。
質問の変更ごとに編集されます。ただし、実際には何も変わりません。あなたは物事を間違って考えているので、あなたの考え方を調整する必要があります。別のショーは必要ありません。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
次に、views/tasks /create.js.coffeeで
($ '#mytable').append("<%= j render(partial: 'tasks/newly_added', locals: { t: @task }) %>")
ここで起こっていることは、ブラウザがcreate.js
を呼び出すことです。 create.js
ブロックのrespond_to
のため、コントローラーはformat.js
テンプレートで応答します。 j
は_newly_added.html.erb
ファイルの内容をエスケープし、その内容がテーブルに追加されます。コントローラーは既存のビューと対話しません。代わりに、JavaScriptがブラウザーに送信され、ビューと対話します。
BackboneやEmberなどのクライアント側MVCフレームワークを使用している場合、これはすべて多少変更されますが、指定しなかったため、ストックRailsを使用していると想定しています。