2012-11-13 64 views
14

我有一個窗體,通過remote => true向數據庫添加行。然後,我想將新數據追加到表格中,但無法獲取正確的視圖進行渲染。從rails中的控制器呈現部分

截至目前,它正在渲染新條目的整個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的這一觀點。

+0

你可以只有一行'tr'的一部分,並在其中渲染新的對象。然後,您可以獲取Ajax調用的響應數據,並將表中生成的html。對於這個使用一個respond_to:js沒有佈局和使用特定的部分 – 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通話。控制器迴應create.js模板,因爲respond_to塊的format.jsj轉義_newly_added.html.erb文件的內容,並將其內容附加到表中。控制器不會與現有視圖交互,而是將JavaScript發送到瀏覽器,並與視圖進行交互。

如果您使用客戶端MVC框架(如Backbone或Ember),這一切都會有所變化,但您並未指定,因此我假設您將使用庫存Rails。

+0

我做了一些編輯我的原始問題,我認爲我發現現在需要發生,但我無法弄清楚語法。 – nathan

+0

與新的一樣,創造。沒有什麼真正改變,但我已經調整了我編輯的問題的答案。 –

+0

我曾嘗試過,以前沒有盛行,但在看到你的帖子後重做了它,它做到了。謝謝! – nathan