Rails – 从控制器触发javascript事件

我正在考虑实施类似下面的内容,并且想知道a)如果由于某种原因我可能是一个非常糟糕的想法,我没有想到,并且b)如果没有 – 是否有现成的gem可以做到这一点。

基本上,我希望能够从我的rails控制器排队javascript事件,以便在下一次渲染时,所有排队的事件都将被触发并从队列中删除。 有点像闪存机制,但对于事件而言。 例如:

在我的控制器中:

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}) 

有什么想法吗?

编辑:这将是有用的,例如,当创建项目时,服务器可以重定向到所述项目的编辑表单,或者可以重定向到相关控制器的索引操作。 这些页面不知道刚刚创建了一个项目。 但是,如果项目是成功创建的话,我想做一些像关闭对话框窗口的事情,但如果不是,则将其保持打开状态,或者我可能需要知道任何其他可能的原因。 显然不仅仅与创造有关,这只是我用来说明问题的例子

编辑:赏金去任何以令人信服的方式说服我这是一个好/坏的想法或提供更好的选择

我看到你想要做什么,但你需要小心保持分开。

在这种情况下我要做的是创建一个哈希,然后在你的视图中#to_json 。 让我们说你的行动的底部

调节器

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

index.html.erb

 
Your usual stuff goes here

jQuery的

 $.ready(function() { events.each(function () { // ... Do what you need to with this }); }); 

我建议使用Rails的闪存消息机制来实现这一点,该机制已经存在,正是为了让用户知道自上次请求以来发生的任何服务器端事件。 将隐藏的机器可解析的描述块粘贴到每个flash消息的末尾,编写一个Ruby API,可以轻松添加这些块,然后在视图中(或者用JS编写)中的某些内容,以便在必要时检索和处理它们。

作为奖励,您还可以直接告诉用户相同动作中的服务器端事件,即使他们没有在浏览器中启用或启用JS。

这是你能做的……

将用户发送到带有givven主题标签的页面

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

映射到:

 /path/tosomething#initiate_awesome 

在该页面中,一旦文档被加载,放入na行检查页面标签,并根据该标签执行js evven。 此处显示了带有Haml的Jquery并使用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事件并执行您想要的操作。 aWesomeness获得。

对于奖励积分,由于此js代码在您的模板中,您可以通过控制器从ruby渲染js片段中的事件名称,并将事件链写入js以进行进一步解析。

嗨,您可以通过以下方式从控制器触发js事件。

 def create if resource.create add_event('resourceCreated', :id => resource.id) end render :update do |page| page << "dismiss()" end end