web-dev-qa-db-ja.com

rails)のコントローラーからパーシャルをレンダリングする

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するように指示する必要があります。

15
nathan

質問の変更ごとに編集されます。ただし、実際には何も変わりません。あなたは物事を間違って考えているので、あなたの考え方を調整する必要があります。別のショーは必要ありません。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を使用していると想定しています。

12
Tim Sullivan