Ruby on Rails - 通过jQuery/Ajax呈现另一个视图中的局部视图

问题描述:

我在我的show-method视图中有一个链接。此链接应在后台运行此模型的创建方法,并且如果完成,则应该更改此视图中的样式和链接。 我不能管理它从另一种方法更改按钮。Ruby on Rails - 通过jQuery/Ajax呈现另一个视图中的局部视图

查看

 <%= div_for @movie do %> 
     <p class="p p-details"> 
      <div class="default_list"> 
      <span class="label label-info"> 
       <%= link_to "Add to Movie List", movies_path(:add_to_list => "default_list", :mashupdb_id => @movie.mashupdb_id),:method => "post", :remote => true, :class =>"a a-label" %> 
      </span> 
      </div> 
     </p> 
     <% end %> 

控制器创建操作:

respond_to do |format| 
    format.html do 
     if request.xhr? 
     render :partial => "movies/delete_from_default_list", :layout => "movies/show", :status => :created 
     end 
    end 
    format.json { render :json => @movie } 
    end 

的jQuery:

jQuery(function($) { 
    // Callback for rendering via HTML 
    $('.movie a[data-type=html]').on('ajax:success', function(event, data, status, xhr) { 
     $(this).parents('div.movie').find('.label-info').replaceWith(data); 
    }); 
}); 

如果我试试这个,没有发生。

它的作品,如果我使用下面的链接和我的show-action只。

<span class="label label-info"> 
    <%= link_to "Add to Movie List", @movies, :remote => true, :class =>"a a-label" %> 
</span> 

可以从另一个控制器渲染一个局部?我还能做什么?

编辑:

现在我试图改变一个js.erb文件的链接。

更改的控制器:

respond_to do |format| 
    format.html 
    format.js { render :content_type => 'text/javascript' } 
    format.json { render :json => @movie } 
    end 

create.js.erb:

if ('<%= @list_operation.eql?('add_to_list_default_list') %>'){ 
    $('#<%= dom_id(@movie) %> .default_list').html('<%= raw escape_javascript(render ("movies/delete_from_default_list"))%>'); 
} 
else if ('<%= @list_operation.eql?('delete_from_list_default_list') %>'){ 
    $('#<%= dom_id(@movie) %> .default_list').html('<%= raw escape_javascript(render ("movies/add_to_default_list"))%>'); 
} 

局部_delete_from_default_list.html.erb

<span class="label label-important"> 
    <%= link_to "Delete from Movie List", movies_path(:delete_from_list => "default_list", :mashupdb_id => @movie.mashupdb_id),:method => "post", :remote => true, :class =>"a a-label" %> 
</span> 

局部_add_to_default_list.html.erb

<span class="label label-info"> 
    <%= link_to "Add to Movie List", movies_path(:add_to_list => "default_list", :mashupdb_id => @movie.mashupdb_id),:method => "post", :remote => true, :class =>"a a-label" %> 
</span> 

如果我点击首次链接时,JS,ERB文件执行,在我看来,内容改变。(@ list_operation包含“add_to_list_default_list”)
如果我现在点击更改的链接,控制器动作也称为成功(@list_operation包含“delete_from_list_default_list”),但没有任何反应。

+0

更多细节,请做这些调用除了替换视图中的东西吗?如保存或删除记录?如果不是的话,你应该为这个与crud方法分开的另一个方法,也不需要使它们成为POST方法。会建议有不同的添加和删除方法。 – Saifis

我通常在这种情况下,要做的就是调用与格式JS Ajax调用,并在响应js.erb,为此,

$('xxxx').html("<%= raw escape_javascript(render :file => "xxxx/xxxx", :locals => { xxx: xxx) %>"); 

渲染部分的js.erb。

我喜欢通过本地需要的实例,你可以将它在控制器中进行decalre,无论哪种方式都可以。

+0

谢谢,现在我可以改变我的链接,但下一个问题直接发生。 只有一次调用js.erb,如果我使用更改后的内容再次调用它,则什么也不会发生。 什么错了? 控制器: respond_to do | format | format.html format.js {render:content_type =>'text/javascript'} format.json {render:json => @movie} end – user1843596

+0

你能发布编辑过的代码吗?另外,你能否尝试弄清楚代码执行的程度?第二次打电话给控制器吗?而第二次通过的参数也会有所帮助。 – Saifis

+0

编辑完成,感谢您的帮助:) – user1843596