Вот один из способов реализации решения (это для Rails 3).
Согласно документации Rails для div_for
, div_for(story, :class => "story")
будет выдавать HTML, который выглядит следующим образом:
<div id="story_123" class="story"> Your content </div>
Итак, с jQuery вы можете запустить что-то вроде:
// Attach click event handlers to your story divs
$(function() {
$("div.story").click(function() {
// Get the HTML ID of the story div
html_id = $(this).attr('id');
// Extract the database id
story_id = html_id.split("_")[1];
// Call your handy function to load story posts
loadStoryPosts(story_id);
});
});
Для ваших ведер я бы не стал использовать другой div_for(story)
. Это приведет к тому, что у вас будет два divs
на странице с одинаковым идентификатором. Вместо этого я бы сделал что-то вроде этого:
<%= div_for(story, :class => "story") do %>
<p>The story</p>
<div class="posts" />
<% end %>
А потом в jQuery
// Make an AJAX request to your Rails server
function loadStoryPosts(story_id) {
// This is a jQuery AJAX GET request to your stories/:id/posts route
$.get("stories/" + story_id + "/posts", function(data) {
html_id = "story_" + story_id;
// Insert the result of the request into the appropriate posts bucket
$("#"+html_id+" .posts").html(data);
});
}
Оставшаяся задача - заставить действие контроллера обработать запрос AJAX и вернуть сообщения, которые нужно вставить на страницу.
class StoriesController < ApplicationController
def posts
story = Story.find params[:id]
# Render the story's posts inside a partial (without any layout)
render :partial => "stories/posts", :locals => { :posts => story.posts }, :layout => false
end
end
Вы также захотите создать частичную визуализацию постов. В моем примере это будет views/stories/_posts.html.erb
.
Это много нового учебного материала, если вы раньше не имели дело с AJAX + Rails, поэтому вот пара полезных уроков: здесь и здесь .