15

remote=>trueを介してDBに行を追加するフォームがあります。次に、新しいデータをテーブルに追加したいのですが、レンダリングする正しいビューを取得できません。

現在のところ、新しいエントリのshow.html.erbページ全体がレンダリングされていますが、として追加される最小バージョンをレイアウトしたいと思います。データベースに挿入した後にレンダリングするビューをコントローラーに指示する簡単な方法はありますか?_newly_added.html.erbという名前の部分をレンダリングしたい

私のコントローラー

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

ありがとう!!

編集 私が必要としているのは、単なる代替の「表示」ビューだと思います。

変更する必要のある方法は、実際には次のとおりです。

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

4

1 に答える 1

13

質問の変更ごとに編集されます。ただし、実際には何も変わりません。あなたは物事を間違って考えているので、あなたの考え方を調整する必要があります。別のショーは必要ありません。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が原因で、コントローラーはテンプレートで応答します。ファイルの内容をエスケープし、その内容をテーブルに追加します。コントローラーは既存のビューと対話しません。代わりに、JavaScriptがブラウザーに送信され、ビューと対話します。respond_toformat.jsj_newly_added.html.erb

BackboneやEmberなどのクライアント側のMVCフレームワークを使用している場合、これはすべて多少変更されますが、指定しなかったため、ストックRailsを使用していると想定しています。

于 2012-11-13T19:53:48.767 に答える