Rails: Как заставить Jquery обновить столбец базы данных после клика - PullRequest
2 голосов
/ 11 июля 2011

Для начала я знаю, что я пытаюсь сделать, это не типично для Rails. Я открыт для предложений по лучшим альтернативам. Я новичок с рельсами, поэтому предложения приветствуются:)

По сути, у меня есть панель уведомлений с 5 уведомлениями. После того, как пользователь щелкнет и увидит уведомления, я хочу установить столбец в базе данных, называемый увиденным, в значение true.

Вот моя функция Jquery:

<script type="text/javascript">
            $(document).ready(function(){
              $("button").click(function(){
                    $("div#count").html("<%= escape_javascript(render('shared/notification_count')) %>");
              });
            });
</script>

А вот код, который я пытаюсь выполнить только после клика (находится в _notification_count.html.erb)

<% notification_ids =   current_user.notifications.map(&:id).join(', ')%>
<% sql = "UPDATE notifications SET SEEN = true where id IN(#{notification_ids})" %>
<% User.connection.select_all(sql) %>

Однако, похоже, что этот код выполняется автоматически при загрузке страницы, а не после щелчка. В чем моя проблема?

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

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

$.ajax({
    url: "/path/to/your/method",
    type: "GET",
    dataType: "script"
});

И в вашем контроллере вы будете обрабатывать то, что вам нужно сделать, а затем визуализировать свой файл js с помощью

respond_to do |format|
    format.js {render 'shared/notification_count'}
end

Это потому, что когда пользователь нажимает на вашу кнопку, код будет выполняться на стороне клиента, но если вы никогда не отправите запрос обратно на сервер, вы не сможете увидеть обновленную версию своей базы данных. , Я предлагаю вам прочитать больше на этом , что мне очень помогло.

2 голосов
/ 11 июля 2011

Содержимое ваших файлов .erb - это просто шаблоны: они оцениваются во время загрузки. Если вы хотите, чтобы взаимодействие с пользователем вызывало какое-то поведение, вы должны делать это исключительно в javascript. В результате способ взаимодействия с базой данных происходит в этой цепочке:

  1. пользователь что-то делает
  2. javascript общается с контроллером (через ajax или отправив форму)
  3. Контроллер получает нужную модель и просит ее что-то сделать
  4. модель взаимодействует с базой данных.

Так что в основном в вашей модели вам нужен код для запуска этих уведомлений. Контроллер попросит модель сделать это только тогда, когда он получит запрос от пользователя / представления.

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