#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, находится здесь