2011-01-22 89 views
11

我想要得到一個link_to顯示通過jquery ajax部分,但似乎無法讓它的工作(編輯:返回空白屏幕),我'我不知道我錯過了什麼。任何幫助,將不勝感激。Rails 3 - link_to調用部分使用jquery ajax

我想點擊鏈接「預覽窗口小部件」,並把它在div 預覽顯示_widget.html.erb

從我的理解鏈接「預覽窗口小部件」應該叫的動作DEF preview_widget這就要求preview_widget.js.erb然後呈現局部_widget.html.erb在div。

編輯:更新按照伊格禮建議

show.html.erb

<%= link_to "Preview Widget", :action => 'preview_widget' , :id => @widget.id, :remote => true %> %> 
<div id="preview"></div> 

鏈接widget_controller.rb

def preview_widget 
    respond_to do | format | 
     format.js {render :layout => false} 
    end 
end 

preview_widget.js。呃b

$("#preview").html("<%= escape_javascript(render(:partial => "widget", :locals => { :widget => @widget})) %>"); 

_widget.html.erb

<% @widget.videos.each do |video| %> 
     <h3><a href='#'><%= video.name %></a></h3> 
     <div> 
     <object height='316' width='540'> 
      <embed style='border: 1px solid #333333;' height='316' width='540' allowfullscreen='true' allowscriptaccess='always' type='application/x-shockwave-flash' src='<%= video.url %>'> 
     </object> 
     </div> 
    <% end %> 

的routes.rb

match 'preview_widget' => 'widgets#preview_widget' 

回答

5

這不是你的問題清,你「似乎什麼都不得到它的工作「..但從我看到在你給的代碼..一切似乎是正確的,但你想念實際的阿賈克斯電話..

它可以通過添加添加:遠程=>真正的「預覽窗口小部件」的鏈接,例如:

<%= link_to "Preview Widget", :action => 'preview_widget' , :id => @widget, :remote => true %> 

如果默認行爲是不夠..或者你可以上添加自己的自定義AJAX調用application.js ..

作爲一個說明,我不認爲設置:「預覽窗口小部件」的id屬性鏈接到@widget是明智的..因爲它會把小部件的字符串表示,它通常會看起來像「<小工具:0x12412 .. >」也許它會更好地將其更改爲「widget-link-#{@widget.id}」

+0

感謝。我在代碼中添加了:remote => true並修復了widget-link-#{@widget.id}。當我點擊它時,鏈接現在是「http:// localhost:3000/preview_widget?id = 1&remote = true」我得到空白頁面了嗎? – pagetribe

+0

您使用了哪個版本的導軌?我假設你使用3. *當我建議添加「:遠程=>真」..作爲3.0開始,軌道使用不顯眼的javascipt方法來處理所有JavaScript相關的功能..如果你使用2. *。那麼你需要將link_to改爲remote_link_to,並且可以選擇刪除「:remote => true」。 –

6

好吧終於得到這個工作與以下變化。
的routes.rb(加入構件小部件資源)

resources :widgets do 
    member do 
     get 'preview_widget' 
    end 
    end 

show.html。erb(更改link_to以匹配路線)

<%= link_to 'Preview', preview_widget_widget_path(:id => @widget.id), :remote => true %> 

現在顯示部分。我仍然不能100%確定以前的代碼有什麼問題 - 至少現在可以工作。

4

我有一個類似的問題,使我受到這種威脅,所以我認爲在這裏分享我的解決方案可能對任何人都有幫助。

隨着:remote => true我有一個正常的HTTP請求http://localhost:3000/info/about?remote=true,而不是想AJAX請求http://localhost:3000/info/about

此修復程序很簡單,但很難找到!

在我HAML查看:

觸發HTTP請求

= link_to(image_tag("icons/information.png", :title => t('menu.info')), :controller => "info", :action => "about", :remote => true) 

觸發AJAX請求

= link_to(image_tag("icons/information.png", :title => t('menu.info')), {:controller => "info", :action => "about"}, :remote => true) 

唯一的區別是{大括號OK碼錯誤的代碼}!

有趣的是,雖然與AJAX請求我得到info/about.html呈現,沒有佈局文件。這不是一個部分,但接近Jan想要的。 我期待着info/about.js.erb被渲染。

在InfoController

def about 
    respond_to do |format| 
     format.html # renders ‘views/info/about.html.erb’ inside layout template on HTTP Request 
     format.js# renders ‘views/info/about.html.erb’, without layout 
    end 
    end 

-

def about 
    respond_to do |format| 
     format.html # => ‘views/info/about.html.erb’ inside layout template on HTTP Request 
     format.js {render 'about.js'} # => renders ‘views/info/about.js.erb’ 
    end 
    end