【问题标题】:Ruby on Rails - Render a partial in another View via jQuery/AjaxRuby on Rails - 通过 jQuery/Ajax 在另一个视图中渲染部分
【发布时间】:2012-11-22 00:47:29
【问题描述】:

我的显示方法视图中有一个链接。此链接应在后台运行此模型的创建方法,如果完成,则应更改此视图中的样式和链接。 我无法通过其他方法更改按钮。

查看

      <%= 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);
    });
});

如果我尝试这样做,则会发生不通知。

如果我只使用下面的链接和我的表演动作,它就可以工作。

<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”),但没有任何反应。

【问题讨论】:

  • 更多细节,这些调用除了替换视图中的东西之外还有什么作用吗?比如保存或删除记录?如果没有,您应该为此创建另一种方法,与 crud 方法分开,也不需要使它们成为 POST 方法。建议也有不同的添加和删除方法。

标签: ruby-on-rails jquery partial-views


【解决方案1】:

这种情况我通常做的就是调用格式为js的ajax调用,在响应的js.erb中,这样做,

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

在 js.erb 中渲染部分。

我喜欢通过本地传递所需的实例,您可以在控制器中对其进行贴花,任何一种方式都可以。

【讨论】:

  • 谢谢,现在我可以更改我的链接,但下一个问题直接出现。 js.erb 只调用一次,如果我使用更改后的内容再次调用它,则没有任何反应。怎么了?控制器:respond_to do |format| format.html format.js { render :content_type => 'text/javascript' } format.json { render :json => @movie } end
  • 您可以在问题中发布编辑后的代码吗?另外,您能否尝试弄清楚代码执行了多远?呼叫是否第二次到达控制器?第二次通过的参数也会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2013-10-08
  • 2016-02-03
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
相关资源
最近更新 更多