Проблема Rails 3 AJAX — UJS

#ruby-on-rails #ajax #ruby-on-rails-3 #unobtrusive-javascript

#ruby-on-rails #ajax #ruby-on-rails-3 #ненавязчивый-javascript

Вопрос:

Хорошо, итак, вот моя настройка, я думаю, что у меня все настроено правильно, но по какой-то причине на странице не отображается ответ AJAX.

В принципе, у меня есть список участников, и я хочу отобразить их «профиль» с помощью ajax на той же странице.

В views /member/index.html.erb

 <table>
 <tr>
  <th>Name</th>
 </tr>

<% @members.each do |member| %>
  <tr>
    <td><%= member.name %> amp;amp; <%= member.sname %></td>
    <td><%= link_to 'Show', member, :remote => true %></td>
    <td><%= link_to 'Edit', edit_member_path(member) %></td>
    <td><%= link_to 'Destroy', member, :confirm => 'Are you sure?', :method => :delete %>    </td>
  </tr>
<% end %>
</table>

<%= link_to 'New Member', new_member_path %>

<div id="memberprofile">

</div>
  

В моем контроллере members у меня есть это:

 def show
  @member = Member.find(params[:id])

  respond_to do |format|
    format.html # show.html.erb
    format.js
    format.xml  { render :xml => @member }
 end
end
  

Затем в моем _show.js.rjs у меня есть это

 page.replace_html('memberprofile', render(@member))
  

Затем в моей части _member.html.erb у меня есть это:

 <h1><%= @member.name %></h1>
  

Несколько вопросов:

1) В консоли написано «Отображаемые элементы / show.html.erb», но я думал, что это просто сделает элемент частичным. почему это?

2) На странице index.html.erb ничего не происходит, когда завершается вызов ajax. Я думал, что наличие крючка div плюс файла javascript сделает свое дело…

Спасибо, ребята

Комментарии:

1. Попробуйте переименовать _show.js.rjs в show.js.rjs , похоже, что ваш format.js рендеринг выполняется по умолчанию show.html.erb

Ответ №1:

вы должны создать новую часть, которая отображает только профиль участника. Допустим, частичное имя _member.html.erb в вашем индексном файле выполняется:

 <%= javascript_include_tag "jquery-1.4.4.min.js", "jquery.form" %>
<script type="text/javascript"> var $j = jQuery.noConflict();</script>

<table>
 <tr>
  <th>Name</th>
 </tr>

<% @members.each do |member| %>
  <tr>
    <td><%= member.name %> amp;amp; <%= member.sname %></td>
    <td><%= link_to 'Show', "javascript:", :onclick => "show_member(member.id)" %></td>
    <td><%= link_to 'Edit', edit_member_path(member) %></td>
    <td><%= link_to 'Destroy', member, :confirm => 'Are you sure?', :method => :delete %>    </td>
  </tr>
<% end %>
</table>

<%= link_to 'New Member', new_member_path %>

<div id="memberprofile">

</div>


<script type="text/javascript">
  function show_member(m_id) {
   var container = $j("#memberprofile");
        $j.ajax({
            url: '/members/get_member?mid='   m_id, type: 'get', dataType: 'html',
            processData: false,
            success: function(data) {
                container.html(data);
            }
        });
}
</script>
  

в ваших маршрутах сделайте что-то вроде:

 resources :members do
  collection do
    get :get_member
  end
end
  

в вашем контроллере не:

 def get_member
  @member = Member.find_by_id(params[:mid])

  render :partial => "member", :layout => false, :locals => {:member => @member}
end
  

в вашем _member.html.erb частично

 <% unless @member.blank? %>
  <h1><%= @member.name %></h1>
<% else %>
   Record not found :(
<% end %>
  

Комментарии:

1. Способ хорош, но он будет лучше с javascript в отдельном файле (см. ненавязчивый javascript ). Хороший учебник о том, как этого следует достичь в Rails 3, находится здесь