在我的模型中,我有:

after_create :push_create

我需要渲染一个视图.我试着这么做:

  def push_event(event_type)
    X["XXXXX-#{Rails.env}"].trigger(event_type, 
      {
        :content => render( :partial =>"feeds/feed_item", :locals => { :feed_item => self })
      }
    )
  end

这激怒了rails,因为它不喜欢我在模型中渲染视图,但我需要它.

错误:

NoMethodError (undefined method `render' for #<WallFeed:0x1039be070>):

建议?我应该在别的地方渲染吗?或者如何在模型中渲染以设置内容?谢谢

推荐答案

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 :我也是!

Ruby-on-rails相关问答推荐

`ActionController::API` 祖先类在加载后不会更新

Sweet Alert 2 在 Rails 7 应用程序中无法正常工作

Rails 7 共享刺激控制器功能

当我必须更改 rspec 中的方法时,如何检测时间?

如何将实例变量传递给 RSpec 共享示例

如何在 to_json 中获取回形针图像的 url

在 JS 模块中使用 Rails-UJS(带有 webpacker 的 Rails 6)

如何在 Ruby on Rails 中创建一个锚点并重定向到这个特定的锚点

Rails data-disable-with re-enable 按钮

将根 url 重定向到 Rails 应用程序中的其他位置

通过字符串获取 ActiveRecord 对象的属性

在 Rails 中创建随机 DateTime 的最佳方法

在 ruby​​ 中构建公钥时,是什么导致既不是 PUB key 也不是 PRIV key::nested asn1 错误?

Ruby on Rails 基本概念总结

导轨链接到:远程

Ruby on Rails - link_to 按钮 / css

Rails:如何修复‘生产’环境缺少 secret_key_base

has_many :通过 class_name 和 foreign_key

如何强制 RSpec 测试失败?

ruby 方法名称中的变量