Подтвердить что ты не робот

Как вызвать метод rails из jQuery

У меня есть этот код JQuery:

$("p.exclamation, div#notification_box").live("mouseover", function() {

    });

и я хочу вызвать этот метод rails из кода jQuery в качестве обратного вызова:

def render_read
  self.user_notifications.where(:read => false).each do |n|
    n.read = true
    n.save
  end
end

Этот метод находится в моей модели пользователя. Есть ли способ сделать это?

4b9b3361

Ответ 1

Сделайте вызов AJAX, настройте маршрут, ответьте с помощью действия контроллера и вызовите ваш метод.

# whatever.js
$("p.exclamation, div#notification_box").on("mouseover", function() {
  $.ajax("/users/render_read")
});

# routes.rb
resources :users do
  get :render_read, on: :collection 
  # or you may prefer to call this route on: :member
end

# users_controller.rb
def render_read
  @current_user.render_read
  # I made this part up, do whatever necessary to find the needed user here
end

PS: Этот код предназначен для Rails 3.x и Ruby 1.9.x

Ответ 2

Хорошо, что у вас есть этот код модели. Нам нужно добавить новое действие и убедиться, что ваш маршрут настроен. Если вы используете ресурсы, вам придется добавлять коллекцию или участника. Поскольку вы делаете обновление, я бы выбрал PUT как метод http.

Вот пример маршрута:

resources :user_notifications do
  collection do
    put 'render_read'
  end
end

Вперед и добавьте действие render_read к вашему контроллеру.

Ваш код jQuery будет выглядеть примерно так:

$("p.exclamation, div#notification_box").live("mouseover", function() {   
  $.ajax({
    url: "/user_notifications/render_read",
    type: 'PUT'
  });
});

Ответ 3

Вам нужно будет настроить контроллер на стороне сервера, чтобы вызвать ваш метод render_read, а затем вы можете использовать $.ajax или $.post в вашем jQuery, чтобы сделать запрос.

Ответ 4

Обычно JavaScript работает на стороне клиента, но также возможно, что ваше приложение рисует функцию javaScript для каждого клиента. В этом случае вы можете использовать <%= и теги %> в файле .erb:

<script type="text/javascript">
$(function(){
    new AClass.function({
        text: <%= Date.today %>
    });
});
</script>