2012-11-19 21 views
0

我有一個名爲ProductsController的控制器。在那個控制器裏有幾個動作,比如襪子和毛巾。我也有襪子和毛巾的意見。襪子和毛巾的視圖頁面的內容完全相同。我將在兩個文件中爲表單使用ajax。由於兩個視圖中的表單完全相同,我們發現創建多個ajax js文件對於在調用ajax時要調用的動作沒有意義。我怎樣才能讓襪子和毛巾都分別調用相同的js.erb文件而不是socks.js.erbtowels.js.erbRails綜合ajax頁面

我的控制器和動作襪子。

def socks 
@socks = Socks.all 

respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @socks } 
    #ok, I get the line below is needed for ajax. Is there something I could add for 
    #the action not to call socks.js.erb and instead a different file, say ajax.js.erb 
    format.js 
end 

end 
+1

你是什麼意思? Ajax調用控制器,而不是一些JavaScript。 –

+0

你說得對。然後Rails會自動調用一個與動作同名的JavaScript嵌入式Ruby(.js.erb)文件。我想知道的是如何獲得所有控制器發送給的js文件。對不起,如果我混淆你。我很難準確地描述我想要的東西。 – jason328

回答

2

我認爲您在尋找render這裏。使用它可以呈現另一個動作的模板/視圖。請參閱文檔:Layouts and Rendering

render 'products/show' 
render :template => 'products/show' 
render "/u/apps/warehouse_app/current/app/views/products/show" 
+0

我不認爲這就是我想要的。我重寫了我的問題以提供一個真實的例子。 – jason328

+0

你爲什麼這麼認爲?它會做你想做的。 –

+0

對我來說更大的問題是如何去工作。我會和它一起玩並解決它。這是我第一次在rails中創建ajax,所以忍受着我。 – jason328

0

Sergio正確地說,你做就怎麼做,使用渲染命令。基本上,在襪子和毛巾動作中,當respond_to用於JS時,您可以呈現一個常見的ajax.js.erb文件。

但是,由於您的評論,我添加了此答案。看起來你的襪子和毛巾方法以及形式和相關的反應非常相似。如果是這樣的話,爲什麼不用同一個動作呢?基本上,您可以使用URL參數來指定ProductsController操作中產品的性質。

所以,你會碰到這樣的:

def ProductsController 

    def index 
     if params[:nature] == "socks" 
      @socks = Sock.all 
      respond_to do |format| 
      format.html # index.html.erb 
      format.json { render json: @socks } 
      format.js 
      end 
     elsif params[:nature] == "towels" 
      @towels = Towel.all 
      respond_to do |format| 
      format.html # index.html.erb 
      format.json { render json: @towels } 
      format.js 
      end 
     end 
    end 
end 

現在,你將需要2個視圖文件index.html.erb和index.js.erb的和那裏你可以再次檢查PARAMS值並顯示相關集合。

這不是一個理想的解決方案,但更快速的修復。

如果失敗,您還可以在ProductsController中定義一個新的操作方法,並且這兩種形式都指向該方法。