ruby-on-rails-5 - Rails 5 渲染 View /部分带有演示者的事件作业

标签 ruby-on-rails-5 actioncable rails-activejob presenter

我是 Rails 新手,我一直在尝试 Active Job 和 Action Cable 以及 Presenter,我已经到处搜索但无法弄清楚。

所以我的问题是有没有办法在部分中使用演示者并将其呈现在 Controller 之外(例如在 ActiveJob 中)?

以下是我想要实现的目标:

我有一个消息系统(更像是电子邮件),带有对话 Controller 和消息 Controller 。我想要实现的是,当有人开始新对话时,如果接收者位于对话索引页面上,新对话会自动附加到他们的索引 View 中。(就像在电子邮件中)通过使用 ActionCable

所以,我的对话.rb

    class Conversation < ApplicationRecord
    has_many :messages, dependent: :destroy
    after_create_commit { ConversationBroadcastJob.perform_later(self) }

conversation_broadcast_job.rb

    class ConversationBroadcastJob < ApplicationJob
     queue_as :default

       def perform(conversation)
        ActionCable.server.broadcast "conversations:#{conversation.receiver_id}",
                              {convo: render_conversation(conversation)}
      end

      private

      def render_conversation(conversation)
        ConversationsController.render(partial: 'conversations/conversation',
                     locals: {conversation: conversation, var: 'not'})
      end

    end

和我的_conversation.html.erb,我按照 RailCast 的这一集使用了演示者

    <% present conversation do |conversation_presenter| %>

    <div class="conversation <%=conversation_presenter.css(var)%>"
         id="conversation_<%= conversation.id %>"
         data-sender-id='<%= conversation_presenter.sender_id%>'>

      <%=conversation_presenter.avatar%>

      <div class="conversation-counterpart-name conversation-info truncate">
        <%=conversation_presenter.name(var) %>
      </div>


      <div class='conversation-subject conversation-info truncate'>
        <%=link_to conversation_messages_path(conversation),
                                      class:'link-gray truncate' do |n|%>
          <%=conversation_presenter.subject %>
           <div class='last-message truncate'>
            <%=conversation_presenter.last_message%>
          </div>
        <% end %>
      </div>

      <div class="conversation-date conversation-info">
        <%=conversation_presenter.last_date%>
      </div>

    </div>

    <% end %>

当前方法在ApplicationHelper中定义

      def present(object, klass = nil)
        klass ||= "#{object.class}Presenter".constantize
        presenter = klass.new(object, self)
        yield presenter if block_given?
        presenter
      end

conversation_presenter.rb

    class ConversationPresenter < BasePresenter

      presents :conversation
      delegate :subject, to: :conversation


      def name(var)
        if conversation.sender_id == var.id
          conversation.receiver.name
        else
          conversation.sender.name
        end
      end

      def last_date
        if conversation.last_msg.nil?
          conversation.render_date
        else
          conversation.last_msg.render_date
        end
      end

      def last_message
        conversation.last_msg.content unless conversation.last_msg.nil?
      end

      def avatar
        h.image_tag('avatar.svg', size: 30, class:'conversation-        counterpart-avatar')
      end

      def css(var)
        "unread" unless
        conversation.read || (!conversation.last_msg.nil? &&     conversation.last_msg.wrote_by(var))
      end

      def sender_id
        if conversation.last_msg.nil?
          conversation.sender_id
        else
          conversation.last_msg.author_id
        end
      end

    end

问题从这里开始,由于我假设的对话演示者,部分内容不会在 ActiveJob 中呈现。 所以我的问题是,是否可以在 Controller 外部使用演示者进行渲染?

如果您需要有关我的代码其他部分的任何信息,请告诉我

谢谢!

最佳答案

我使用了以下代码足以从 ActiveJob 运行它:

ApplicationController.new.render_to_string(
  :template => 'users/index',
  :layout => 'my_layout',
  :locals => { :@users => @users }
)

摘自https://makandracards.com/makandra/17751-render-a-view-from-a-model-in-rails

关于ruby-on-rails-5 - Rails 5 渲染 View /部分带有演示者的事件作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42891393/

相关文章:

ruby-on-rails - 默认情况下,如何在 Rails 中使 cookie 安全(仅限 https)?

ruby-on-rails - 基于枚举值的自定义顺序

ruby-on-rails - 如何首先在 broadcasts_to 中呈现部分内容然后重定向 (AbstractController::DoubleRenderError)

ruby-on-rails - Rails 5 params 对象具有空数组作为值被删除

ruby-on-rails - Rails 5 Actioncable 没有 channel 的全局消息

ruby-on-rails - Rails5 ActionCable 包括来自 SessionsHelper 的 current_user 方法

ruby-on-rails-5 - Ruby on Rails 5 Action 电缆 : stream for current model instance (URL-based subscriptions)

ruby-on-rails - 带有Resque插件的ActiveJob

ruby-on-rails - Action Job/Mailer 的 `deliver_now` 和 `deliver_later` 之间的区别

ruby-on-rails - 事件作业的 Rails 设置(等待 : 2. 分钟)方法不起作用