Как вызвать метод 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
Этот метод находится в моей модели пользователя. Есть ли способ сделать это?
Ответы
Ответ 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>