proper solution
"他们"是对的.你真的需要在控制器中进行渲染-
我从这个链接得到了最多的帮助:http://www.amberbit.com/blog/2011/12/27/render-views-and-partials-outside-controllers-in-rails-3/
在lib/action_pusher中.rb
class ActionPusher < AbstractController::Base
include AbstractController::Rendering
include AbstractController::Helpers
include AbstractController::Translation
include AbstractController::AssetPaths
include Rails.application.routes.url_helpers
helper ApplicationHelper
self.view_paths = "app/views"
class Pushable
def initialize(channel, pushtext)
@channel = channel
@pushtext = pushtext
end
def push
Pusher[@channel].trigger('rjs_push', @pushtext )
end
end
end
应用内/推送者/用户\推送者.rb.我想我们可以go 更国际化的地方?
require 'action_pusher'
class UsersPusher < ActionPusher
def initialize(user)
@user = user
end
def channel
@user.pusher_key
end
def add_notice(notice = nil)
@notice = notice
Pushable.new channel, render(template: 'users_pusher/add_notice')
end
end
现在在我的模型中,我可以这样做:
after_commit :push_add_notice
private
def push_add_notice
UsersPusher.new(user).add_notice(self).push
end
然后你会想要一个局部的,例如app/views/users\u pusher/add\u notice.js.haml,可以简单到:
alert('#{@notice.body}')
我猜你真的不需要用可推动的内部类和.推
祝你好运
(这是我的第一份答案草稿,留下来是因为它可能会帮助别人)
我有一个有效解决方案的概要.这样,在你的模型中:
after_create :push_new_message
private
def render_anywhere(partial, assigns = {})
view = ActionView::Base.new(ActionController::Base.view_paths, assigns)
view.extend ApplicationHelper
view.render(:partial => partial)
end
def push_new_message
pushstring = render_anywhere('notices/push_new_message', :message_text => self.body)
Pusher[user.pusher_key].trigger!('new_message', pushstring)
end
这确实有效——模板正在呈现,并在客户端成功地得到eval().我打算把它清理干净,几乎肯定会把render_搬到更普通的地方,可能会try something like this次
我可以看到Push需要自己的模板,调用通常可用的模板,我可能会try 在一个地方收集所有模板.一个很好的小问题是,我有时在我的partials中使用controller_name,比如点亮菜单项,但显然我必须采取不同的策略.我猜我可能需要做些什么来获得更多的帮助,但我还没有到达那里.
Success! Hooray! This should answer your question, and mine - I'll add more detail if it seems appropriate later. 祝你好运!!!
为了清楚起见,一小时前的原始非答案留下了
我没有答案,但这个及时的问题值得进一步澄清,我希望通过帮助提问,接近my个答案:)
我也面临同样的问题.为了解释得更清楚一点,Pusher异步地将内容发送到连接的用户浏览器.一个典型的用例是向用户显示他们收到了来自另一个用户的新消息.使用Pusher,您可以将消息推送到接收者的浏览器,这样他们在登录时会立即收到通知.想要了解Pusher可以做什么,请查看http://wordsquared.com/
你可以发送任何你喜欢的数据,比如一个JSON散列来解释你喜欢它的方式,但是发送RJ会非常方便,就像在客户端使用任何其他ajax调用和eval()一样.通过这种方式,您可以(例如)为菜单栏呈现模板,对其进行整体更新,或者只显示给用户的新消息计数,使用所有相同的部分使其保持干爽.原则上,您可以从sender's控制器渲染部分,但这也没有多大意义,甚至可能没有请求,它可能由cron作业(job)或其他事件触发,例如股价变化.发送方控制器不应该知道这一点——我喜欢让控制器处于饥饿状态;)
这听起来可能违反了MVC,但事实并非如此——应该用ActionMailer之类的东西来解决,但要与应用程序的其他部分共享帮助程序和部分.我知道,在我的应用程序中,我希望在发送ActionMailer呼叫的同时(或代替)发送推送事件.我想根据用户A的事件为用户B呈现任意部分.
这些链接可能为解决方案指明了方向:
最后一个看起来最有希望,提供了以下诱人的片段:
def render_anywhere(partial, assigns)
view = ActionView::Base.new(Rails::Configuration.new.view_path, assigns)
ActionView::Base.helper_modules.each { |helper| view.extend helper }
view.extend ApplicationHelper
view.render(:partial => partial)
end
正如上面另一张海报提供的this link.
如果我能找到工作,我会汇报的
tl;doctor :我也是!