При использовании Jquery для удаленного обновления элемента страницы, как сохранить коллекции / переменные? - PullRequest
0 голосов
/ 24 июля 2011

Я хотел бы использовать jQuery для обновления партиала на странице, но я не могу заставить партиал работать, потому что требуемая коллекция недоступна после выполнения кода jQuery.

У меня естьдействие show в контроллере Users:

  def show
      @user = User.find(params[:id])
      @title = "#{@user.first_name} #{@user.last_name}"
      @posts = @user.posts.paginate(:page => params[:page], :per_page => 20 )
      @discussions = @user.discussions.paginate(:page => params[:page], :per_page => 2)
    end

Это делает коллекции @posts и @discussions доступными на странице показа пользователя для передачи в партиалы следующим образом, в show.html.erb:

<div id="synopsis">
    <%= render :partial => 'users/post', :collection => @posts %>
</div>
<div class="pagination_links">
    <%= will_paginate(@posts) %>
</div>

Однако, скажем, я хочу заменить сообщения, отображаемые на странице показа пользователя, на обсуждения пользователя, т. Е. Использовать @discussions, доступные в действии показа.Для этого я настроил настраиваемое действие в контроллере Users с именем show_discussions и заставил маршруты к нему работать.это действие:

def show_discussions
  respond_to do |format|
    format.js
  end
end

Ссылка на show_discussion.js.erb

$("#synopsis").html("<%= (escape_javascript("#{render(:partial => 'discussion_activity', :collection => @discussions)}")).html_safe %>");

Этот файл успешно заменяет #synopsis, но не заполняет его ничем - так как коллекция @discussions не делает 'Не удается выполнить удаленный вызов этого действия.Как я могу исправить это так, чтобы обсуждения пользователей стали доступны после удаленного вызова?

ОБНОВЛЕНИЕ: Я делаю запрос ajax, используя файл js.Я указываю, чтобы получить действие пользователя show_discussions при нажатии кнопки:

 $(function() {
$('#show_discussions').live("click", function() {
    $.get('/users/show_discussions');
});
    $('#show_posts').live("click", function() {
    $.get('/users/show_posts');
});
 });

1 Ответ

0 голосов
/ 24 июля 2011

Помните, что ваше приложение не имеет контекста от одного запроса к другому (ну, кроме того, что находится в вашем сеансе, и ваших переменных поста).Все, что вам нужно для визуализации представления, вы должны предоставить в действии контроллера.

Вы можете передать любой необходимый контекст, такой как идентификатор пользователя, в качестве параметра в вашем запросе ajax.

Длянапример, см. первый ответ на этот вопрос

Поскольку вы используете GET вместо POST, вы можете просто прикрепить идентификатор пользователя к URL-адресу при записи его в представление.Ваш скрипт должен выглядеть примерно так:

$.get('/users/show_discussions/123);

, где 123 - идентификатор пользователя.

Чтобы записать идентификатор пользователя в представление в виде переменной javascript, вы можете сделать что-то вроде:

<script>
  var jsUserID = <%= @user.id %> ;
</script>

, если у вас есть только один идентификатор пользователя на странице.Ваш код ссылки становится:

 $.get('/users/show_discussions/' + jsUserID);  

TL; DR: вам нужно загрузить @discussions в show_discussions

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...