Rails 3 - 使用jquery ajax调用partial的link_to

pag*_*ibe 11 jquery ruby-on-rails ruby-on-rails-3

我试图得到一个link_to来显示部分通过jquery ajax,但似乎无法让它工作(编辑:返回空白屏幕),我不知道我错过了什么.任何帮助,将不胜感激.

我想点击"预览窗口小部件"链接,让它在div 预览中显示_widget.html.erb.

根据我的理解,链接"预览小部件"应该调用动作def preview_widget,它调用preview_widget.js.erb然后在div中呈现部分_widget.html.erb.

编辑:根据Ignatius Reza建议更新链接

show.html.erb

<%= link_to "Preview Widget", :action => 'preview_widget' , :id => @widget.id, :remote => true %> %>
<div id="preview"></div>
Run Code Online (Sandbox Code Playgroud)

widget_controller.rb

def preview_widget  
    respond_to do | format |  
        format.js {render :layout => false}  
    end
end
Run Code Online (Sandbox Code Playgroud)

preview_widget.js.erb

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

_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 %>
Run Code Online (Sandbox Code Playgroud)

的routes.rb

match 'preview_widget' => 'widgets#preview_widget'
Run Code Online (Sandbox Code Playgroud)

pag*_*ibe 6

好的,最后得到了以下更改.
routes.rb(添加成员到窗口小部件资源)

  resources :widgets do
    member do
      get 'preview_widget'
    end
  end
Run Code Online (Sandbox Code Playgroud)

show.html.erb(更改了link_to以匹配路由)

<%= link_to 'Preview', preview_widget_widget_path(:id => @widget.id),  :remote => true %>
Run Code Online (Sandbox Code Playgroud)

现在显示部分.我仍然不能100%确定以前的代码有什么问题 - 至少它现在有效.


Ign*_*eza 5

它没有在你的问题上清除,你"似乎无法让它工作"......但是从我给你的代码中看到的......一切似乎都是正确的,但你错过了实际的ajax调用..

它可以通过添加:remote => true添加到"预览窗口小部件"链接,例如:

<%= link_to "Preview Widget", :action => 'preview_widget' , :id => @widget, :remote => true %>
Run Code Online (Sandbox Code Playgroud)

如果默认行为足够..或者您可以在application.js上添加自己的自定义ajax调用..

作为一个注释,我不认为设置"预览窗口小部件"链接到@widget的:id属性是明智的..因为它将放置窗口小部件的字符串表示,通常看起来像"<Widget:0x12412 ..> "也许最好把它改成"widget-link-#{@widget.id}"