2012-11-22 68 views
1

我在我的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

回答

1

我通常在這種情況下,要做的就是調用與格式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