Rails Mailboxer - 从Button创建对话

时间:2014-02-04 16:16:43

标签: ruby-on-rails mailboxer

我正在使用mailboxer gem在应用上实现用户消息传递。目前,我已根据此https://github.com/RKushnir/mailboxer-app设置了它。用户可以在表单中输入电子邮件地址,主题和消息,然后开始对话。

我希望用户能够在不必输入其他用户电子邮件地址的情况下开始对话 - 例如,单击相关页面上的按钮,我可以将@user作为收件人传递。

这是我当前的控制器:

class ConversationsController < ApplicationController
      authorize_resource
      helper_method :mailbox, :conversation


      def create
        recipient_emails = conversation_params(:recipients).split(',')
        recipients = User.where(email: recipient_emails).all

        conversation = current_user.
          send_message(recipients, *conversation_params(:body, :subject)).conversation

        redirect_to conversation
      end

      def reply
        current_user.reply_to_conversation(conversation, *message_params(:body, :subject))
        redirect_to conversation
      end

      def trash
        conversation.move_to_trash(current_user)
        redirect_to :conversations
      end

      def untrash
        conversation.untrash(current_user)
        redirect_to :conversations
      end

      private

      def mailbox
        @mailbox ||= current_user.mailbox
      end

      def conversation
        @conversation ||= mailbox.conversations.find(params[:id])
      end

      def conversation_params(*keys)
        fetch_params(:conversation, *keys)
      end

      def message_params(*keys)
        fetch_params(:message, *keys)
      end

      def fetch_params(key, *subkeys)
        params[key].instance_eval do
          case subkeys.size
          when 0 then self
          when 1 then self[subkeys.first]
          else subkeys.map{|k| self[k] }
          end
        end
      end
    end

和相应的_form:

<%= form_for :conversation, url: :conversations do |f| %>
      <%= f.text_field :recipients %>
      <%= f.text_field :subject %>
      <%= f.text_field :body %>
      <div class="form-actions">
        <%= f.button :submit, class: 'btn-primary' %>
        <%= submit_tag 'Cancel', type: :reset, class: 'btn btn-danger' %>
      </div>
    <% end %>

我已经获得了与回复消息对话,显示所有用户对话等有关的所有观点和操作,但不知道如何在不必输入地址的情况下启动它。

感谢您的帮助

补充:我不介意编辑上述表格等,并且失去了用户输入另一个电子邮件的能力,因为我不希望他们能够这样做。有问题的按钮将按照“向客户询问问题”或“询问场地问题”的方式命名,而不仅仅是向随机用户发送消息。

编辑添加:

谢谢你,这很有道理,我几乎就在那里......

我最终添加了原始对话表单的副本(在我的_form文件中):

 <%= form_for :conversation, url: :conversations do |f| %>
        <%= f.text_field :recipients %>
        <%= f.text_field :subject %>
        <%= f.text_field :body %>
        <div class="form-actions">
          <%= f.button :submit, class: 'btn-primary' %>
          <%= submit_tag 'Cancel', type: :reset, class: 'btn btn-danger' %>
        </div>
      <% end %>

这可以从我需要的正确视图中正常工作,并按预期完成所有操作 - 但是,当我尝试隐藏收件人文本字段并传入用户电子邮件地址时(而不是必须手动输入,我遇到了问题:

 <%= form_for :conversation, url: :conversations do |f| %>
        <%= hidden_field_tag :recipients, "#{@enquiry.client.user.email}" %>
        <%= f.text_field :subject %>
        <%= f.text_field :body %>
        <div class="form-actions">
          <%= f.button :submit, class: 'btn-primary' %>
          <%= submit_tag 'Cancel', type: :reset, class: 'btn btn-danger' %>
        </div>
      <% end %>

这在控制器中引发错误:

未定义的方法`split'代表nil:NilClass

 def create
recipient_emails = conversation_params(:recipients).split(',')
recipients = User.where(email: recipient_emails).all
conversation = current_user. 

如果我在表单上点击提交之前在Firefox上查看了源代码,我可以看到有一个字段,用户的电子邮件地址正确传入,但是由于某些原因它不会进入控制器? / p>

可能有所帮助的东西 - 如果我将hidden_​​field_tag更改回正常字段,并按上述方式传入电子邮件地址,则视图甚至不会加载。这是说     “未定义的方法`merge”为“user@user.com”:字符串 并在代码中突出显示该行。

由于

1 个答案:

答案 0 :(得分:1)

在邮箱中,您不会向电子邮件地址发送邮件,而是将邮件发送到其上有acts_as_messageable的模型,例如用户。以下代码是我如何完成它的粗略实现,在控制器中设置了@user变量,因为它位于配置文件页面上。

<%= form_tag("/messages/send_message", method: "post", url: send_message_path) do  %>
<%= hidden_field_tag :user_id, "#{@user.id}" %>
<%= text_field_tag :subject, nil, :class => 'form-control', :placeholder => "Subject" %>
<%= text_area_tag :message, nil, :class => 'form-control', :placeholder => "Message" %>
<%= submit_tag "Submit", :class => "btn btn-primary" %>
<% end %>

这会有一个动作就像你这样告诉控制器:

def send_message
@user = User.find(params[:user_id])
@message = params[:message]
@subject = params[:subject]
current_user.send_message(@user, "#{@message}", "#{@subject}")
redirect_to root_path
end

或者,在您的情况下,如果您想要电子邮件地址,您可以通过数据库中的电子邮件地址找到收件人:

def send_message
@user = User.find_by_email(params[:user_email])
@message = params[:message]
@subject = params[:subject]
current_user.send_message(@user, "#{@message}", "#{@subject}")
redirect_to root_path
end

在你的路线文件中有这样的东西:

post '/messages/send_message', :to => "messages#send_message", :as => "send_message"

真的希望这有帮助!