Rails Mailboxer — создание диалога с помощью кнопки

Я использую гем mailboxer для реализации обмена сообщениями с пользователем в приложении. В настоящее время я настроил его на основе этого 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 до того, как нажму «Отправить» в форме, я увижу, что там есть поле с адресом электронной почты пользователя, переданным правильно, но по какой-то причине он просто не попадает в контроллер?

Что-то, что может помочь. Если я изменю hidden_field_tag ​​обратно на обычное поле и передам адрес электронной почты, как указано выше, представление даже не загрузится. Он говорит «неопределенный метод «слияния» для «[email protected]»: строка и выделяет эту строку в коде.

Спасибо


person Ralph King    schedule 04.02.2014    source источник


Ответы (1)


В почтовом ящике вы не отправляете сообщение на адрес электронной почты, а отправляете его модели, на которой есть acts_as_messageable, например user. Следующий код является грубой реализацией того, как я это сделал, с переменной @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"

Очень надеюсь, что это поможет!

person Amar H-V    schedule 05.02.2014
comment
Спасибо, очень полезно. Я почти закончил и добавил еще один последний запрос выше! Пытаюсь заставить последнюю часть работать. - person Ralph King; 05.02.2014
comment
На самом деле поцарапайте это, я должен был выглядеть усерднее, ответьте здесь: stackoverflow.com/questions/6636875/. Я отмечу ваш ответ выше как правильный, так как он привел меня на правильный путь, и я уверен, что поможет другим в будущем. Спасибо - person Ralph King; 05.02.2014