Rails - запуск событий javascript с контроллеров - PullRequest
4 голосов
/ 15 июля 2011

Я думаю о реализации чего-то вроде следующего и хотел бы знать: а) возможно, это действительно плохая идея по какой-то причине, о которой я не задумывался, и б) если нет - есть ли там существующий драгоценный камень?чтобы сделать это.

По сути, я бы хотел иметь возможность ставить в очередь события javascript от моих контроллеров rails, чтобы при следующем рендеринге все события в очереди были запущены и удалены из очереди.Вроде как механизм вспышки, но вместо событий.Например:

в моем контроллере:

def create
  if resource.create 
    add_event('resourceCreated', :id => resource.id)
  end
end

и в макете моего приложения что-то вроде:

%javascript
  - @events.each do |e|
    $(document).trigger(#{e.event_name}, #{e.event_data})

Есть мысли?

Редактировать: Это было бы полезно, например, когда элемент создается, сервер может перенаправить на форму редактирования для указанного элемента или может перенаправить на действие индекса для соответствующего контроллера.Эти страницы не знают, что элемент был только что создан.Однако, возможно, я хочу сделать что-то вроде закрытия диалогового окна, если элемент был успешно создан, но оставить его открытым, если это не так, или по ряду других возможных причин, которые мне, возможно, нужно знать об этом.Очевидно, что это не просто относится к творениям, это просто пример, который я использую для иллюстрации проблемы

Редактировать: Щедрость достается тому, кто убедит меня в том или ином, что это хорошо/ плохая идея или предлагает лучшую альтернативу

Ответы [ 4 ]

5 голосов
/ 31 июля 2011

Я вижу, что вы пытаетесь сделать, но вы должны быть осторожны, чтобы не связывать вещи.

В этой ситуации я бы создал хеш, а затем #to_json на ваш взгляд.Допустим, в нижней части вашего действия

контроллер

@events = [
   { :type => "item_created", :message => "Woohoo! Item was created"}
]

index.html.erb

<div>Your usual stuff goes here</div>
<script type="text/javascript" charset="utf-8">
  var events = <%= raw @events.to_json %> // You must make sure it's properly sanitised
</script>

JQuery

$.ready(function() { 
   events.each(function () {
      // ... Do what you need to with this
   });
});
2 голосов
/ 28 июля 2011

Я бы предложил сделать это с помощью механизма флеш-сообщений Rails, который уже существует именно для того, чтобы дать пользователю знать о любых серверных событиях, которые произошли со времени последнего запроса. Поместите скрытый разбираемый машиной фрагмент описания в конец каждого флэш-сообщения, напишите Ruby API, который облегчает добавление таких блоков, а затем что-то на ваш взгляд (или, возможно, написанное в JS), чтобы получать и обрабатывать их при необходимости .

В качестве бонуса вы также можете напрямую сообщать пользователю о серверных событиях в одном движении, даже если у них не включена или не включена поддержка JS в браузере.

0 голосов
/ 01 августа 2011

Привет, вы можете запускать события js с вашего контроллера следующим образом.

def create
  if resource.create 
    add_event('resourceCreated', :id => resource.id)
  end
    render :update do |page|
      page << "dismiss()"
    end
end
0 голосов
/ 15 июля 2011

Вот что вы можете сделать ...

Отправить пользователя на страницу с хэштегом givven

= link_to "Get aWesome!", awesomem_page_path + '#initiate_awesome' 

, который отображается на:

/path/tosomething#initiate_awesome

На этой странице, как только документ загружен, поместите в строку na, чтобы проверить хэштег страницы, и выполните js evven в зависимости от этого хэштега. Пример, показанный здесь для Jquery с Haml и использованием событий Jquery:

%h1  aWesomeness is about to happen...

- content_for :jquery do
  :javascript
    $(document).ready(function(){
      if (document.location.hash === "#initiate_awesome"){
        $('#amazing_div').trigger('awesome_event');
      } else {
            $('#not_so_cool_div').trigger('ultimate_letdown');
      }
     });

С этой настройкой, как только страница загрузится, она вызовет ваше событие js и сделает то, что вы хотите. удивительность приобрела.

Для бонусных баллов, поскольку этот код js находится в вашем шаблоне, вы можете визуализировать имена событий в фрагменте js из ruby ​​с помощью контроллера, а цепочку событий выписать в js для дальнейшего анализа.

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